Pagini recente » Cod sursa (job #1005830) | Cod sursa (job #1437342) | Cod sursa (job #497586) | Cod sursa (job #141026) | Cod sursa (job #2543229)
#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;
}
else
if(aux[l+x[o]][c+y[o]]>aux[l][c]+1)
{
dx.push_back(l+x[o]);
dy.push_back(c+y[o]);
aux[l+x[o]][c+y[o]]=aux[l][c]+1;
}
}
if(aux[l][c]>maxx) maxx=aux[l][c];
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]]-1>=mij || (l==lin2 && c==col2)) && a[l+x[0]][c+y[o]]!=-1)
{
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;
}
}
resett();
filll();
st=1; dr=maxx;
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;
}