Pagini recente » Cod sursa (job #1573164) | Cod sursa (job #3157109) | Cod sursa (job #1915187) | Cod sursa (job #862074) | Cod sursa (job #328374)
Cod sursa(job #328374)
#include <cstdio>
#define DIM 1003
int dl[4]={-1,0,1,0};
int dc[4]={0,-1,0,1};
int n,j,ix,sw,iy,mx,mi,ac,bc,my,p,u,nn,m[DIM][DIM],b[DIM][DIM],i,il,ll;
char a[DIM];
struct coada{ int l,c;} c[DIM*DIM],x,y;
using namespace std;
void bordare()
{//bordez ambele matrici
for(i=0; i<=n; ++i) { b[i][0]=b[i][nn+1]=m[i][0]=m[i][nn+1]=-2;}
for(i=0; i<=nn; ++i) { b[n+1][i]=b[0][i]=m[n+1][i]=m[0][i]=-2;}
}
int bfs()
{
p=1;
while(p<=u)
{
x=c[p++];
for(i=0; i<4; ++i)
{
y.l=x.l+dl[i];
y.c=x.c+dc[i];
if(m[y.l][y.c]==0)
{
m[y.l][y.c]=m[x.l][x.c]+1;
c[++u]=y;
}
}
}
}
int bfs2( int k )
{
sw=0;
p=u=0;
x.l=ix; x.c=iy;
b[x.l][x.c]=1;
c[p]=x;
while( p<=u )
{
x=c[p++];
for(il=0; il<4; ++il)
{
y.l=x.l+dl[il];
y.c=x.c+dc[il];
if( b[y.l][y.c]==0 )
{
if( m[y.l][y.c]>=k ) //verific proprietatea
{
b[y.l][y.c]=b[x.l][x.c]+1;
c[++u]=y;
}
else b[y.l][y.c]=-2;//cel care nu are il elimin
}
}
}
if(b[mx][my]>0) sw=1;
for(il=1; il<=n; ++il) //golire();
for(ll=1; ll<=nn; ++ll)
b[il][ll]=0;
return sw;
}
int bsearch()
{
for(i=1, j=n*nn, mi=i+(j-i)/2; i<=j; mi=i+(j-i)/2)
{
ac=bfs2(mi);
bc=bfs2(mi+1);
if( ac && !bc ) return mi; //perfect :>
else
if( ac ) i=mi+1; //bigger
else
j=mi-1; //smaller
}
return 0;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&n,&nn);
for(i=1; i<=n; ++i)
{
scanf("%s\n",&a);
for(j=0;j<nn;++j)
if(a[j]=='D') { x.l=i; x.c=j+1;m[x.l][x.c]=1; c[++u]=x;}
else
if(a[j]=='*') {m[i][j+1]=-2;}
else
if(a[j]=='I') {ix=i;iy=j+1;}
else
if(a[j]=='O') {mx=i;my=j+1;}
}
bordare();
bfs();
printf("%d\n" ,bsearch()-1 );
return 0;
}