Pagini recente » Cod sursa (job #1329874) | Cod sursa (job #2111591) | Cod sursa (job #1525746) | Cod sursa (job #1737507) | Cod sursa (job #2544848)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, i, j, aux[1005][1005], x[4]={1, -1, 0, 0}, y[4]={0, 0, 1, -1}, maxx=0, st, dr, mij, lin1, col1, lin2, o, col2;
int a[1005][1005];
char sir[1005][1005];
deque <int> dx;
deque <int> dy;
void modif()
{
int i, j;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
if(a[i][j]!=-1) a[i][j]=0;
}
void resett()
{
int i;
for(i=0; i<=m+1; i++)
{
aux[0][i]=-1;
aux[n+1][i]=-1;
a[0][i]=-1;
a[n+1][i]=-1;
}
for(i=1; i<=n; i++)
{
aux[i][0]=-1;
aux[i][m+1]=-1;
a[i][0]=-1;
a[i][m+1]=-1;
}
}
void filll()
{
int l, c, o;
while(!dx.empty())
{
l=dx.front();
c=dy.front();
for(o=0; o<=3; o++)
if(aux[l+x[o]][c+y[o]]==0)
{
dx.push_back(l+x[o]);
dy.push_back(c+y[o]);
aux[l+x[o]][c+y[o]]=aux[l][c]+1;
}
dx.pop_front();
dy.pop_front();
}
}
void lee2(int l, int c)
{
dx.push_back(l);
dy.push_back(c);
while(!dx.empty())
{
l=dx.front();
c=dy.front();
for(o=0; o<=3; o++)
if(a[l+x[o]][c+y[o]]==0 && aux[l+x[0]][c+y[o]]>=mij)
{
a[l+x[o]][c+y[o]]=a[l][c]+1;
dx.push_back(l+x[o]);
dy.push_back(c+y[o]);
}
dx.pop_front();
dy.pop_front();
}
}
int main()
{
fin >> n >> m;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
fin >> sir[i][j];
if(sir[i][j]=='D')
{
dx.push_back(i);
dy.push_back(j);
aux[i][j]=1;
a[i][j]=-1;
}
if(sir[i][j]=='I')
{
lin1=i;
col1=j;
}
if(sir[i][j]=='O')
{
lin2=i;
col2=j;
}
if(sir[i][j]=='*')
{
a[i][j]=-1;
aux[i][j]=-1;
}
}
resett();
filll();
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
aux[i][j]--;
if(aux[i][j]>maxx) maxx=aux[i][j];
}
st=1; dr=n+m;
maxx=-1;
while(st<=dr)
{
mij=(st+dr)/2;
modif();
a[lin1][col1]=1;
lee2(lin1, col1);
if(a[lin2][col2])
{
maxx=mij;
st=mij+1;
}
else dr=mij-1;
}
fout << maxx;
return 0;
}