Pagini recente » Cod sursa (job #2555454) | Cod sursa (job #3214672) | Cod sursa (job #1261958) | Cod sursa (job #527250) | Cod sursa (job #414601)
Cod sursa(job #414601)
#include<cstdio>
struct punct
{
int lin,col;
};
int R,C,m[1002][1002],matr[1002][1002];
char a[1002][1002];
int dl[]={0,1,0,-1};
int dc[]={-1,0,1,0};
punct fin,inc,coada[1<<20];
int max(int x,int y)
{
if(x>y)
return x;
return y;
}
void lee1()
{
int i,j,u=0;
punct x,y;
for(i=1;i<=R;i++)
for(j=1;j<=C;j++)
if(a[i][j]=='D')
{
coada[u].lin=i;
coada[u].col=j;
u++;
}
for(i=0;i<u;i++)
{
x.lin=coada[i].lin;
x.col=coada[i].col;
for(j=0;j<4;j++)
if(m[x.lin+dl[j]][x.col+dc[j]]==0 && (a[x.lin+dl[j]][x.col+dc[j]]=='.' || a[x.lin+dl[j]][x.col+dc[j]]=='I' || a[x.lin+dl[j]][x.col+dc[j]]=='O'))
{
y.lin=x.lin+dl[j];
y.col=x.col+dc[j];
m[y.lin][y.col]=m[x.lin][x.col]+1;
coada[u]=y;
u++;
}
}
}
int lee(int POQ)
{
int i,j,u=0;
punct x,y;
coada[u++]=inc;
if(m[inc.lin][inc.col]<POQ)
return 0;
for(i=1;i<=R;i++)
for(j=1;j<=C;j++)
matr[i][j]=0;
for(i=0;i<u;i++)
{
x.lin=coada[i].lin;
x.col=coada[i].col;
for(j=0;j<4;j++)
if(matr[x.lin+dl[j]][x.col+dc[j]]==0 && m[x.lin+dl[j]][x.lin+dc[j]]>=POQ)
{
y.lin=x.lin+dl[j];
y.col=x.col+dc[j];
matr[y.lin][y.col]=matr[x.lin][x.col]+1;
coada[u]=y;
u++;
}
}
if(matr[fin.lin][fin.col]!=0)
return 1;
return 0;
}
int cautb()
{
int i=0,cond,pas=1<<11;
cond=max(R,C);
for(i=0;pas;pas>>=1)
if(lee(i+pas))
i+=pas;
return i;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&R,&C);
for(int i=1;i<=R;i++)
gets(a[i]+1);
for(int i=1;i<=R;i++)
a[i][0]=a[i][C+1]='*';
for(int j=1;j<=C;j++)
a[0][j]=a[R+1][j]='*';
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++)
{
if(a[i][j]=='I')
{
inc.lin=i;
inc.col=j;
}
else if(a[i][j]=='O')
{
fin.lin=i;
fin.col=j;
}
}
lee1();
printf("%d",cautb());
return 0;
}