Pagini recente » Cod sursa (job #2360459) | Cod sursa (job #90547) | Cod sursa (job #451425) | Cod sursa (job #794999) | Cod sursa (job #414607)
Cod sursa(job #414607)
#include<cstdio>
struct punct
{
int lin,col;
};
const int N=1<<10;
int R,C,m[N][N],matr[N][N];
char a[N][N];
int dl[]={0,1,0,-1};
int dc[]={-1,0,1,0};
punct fin,inc,coada[N*N];
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 bordare()
{
int i,j;
for(i=0;i<=R;i++)
m[i][0]=m[i][C+1]=-1;
for(j=0;j<=C;j++)
m[0][j]=m[R+1][j]=-1;
for(i=1;i<=R;i++)
for(j=1;j<=C;j++)
if(a[i][j]=='*')
m[i][j]=-1;
}
int cautb()
{
bordare();
int i=0,pas=1<<11;
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;
}