Pagini recente » Cod sursa (job #1906987) | Cod sursa (job #2919447) | Cod sursa (job #3214078) | Cod sursa (job #3215327) | Cod sursa (job #509610)
Cod sursa(job #509610)
#include <cstdio>
const int N=1002;
struct elem
{
int lin,col;
};
elem c[N*N];
int il,ic,fl,fc,q,m,j,n,i,p,u;
int a[N][N],v[N][N];
char b[N][N];
const int dlin[]={-1,0,1,0};
const int dcol[]={0,1,0,-1};
void scrie()
{
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%5d ",a[i][j]);
printf("\n");
}
//printf("\n");
}
void lee ()
{
elem xn;
p = 1;
while (p<=u)
{
for (i=0;i<4;i++)
{
xn.lin=c[p].lin+dlin[i];
xn.col=c[p].col+dcol[i];
if (a[xn.lin][xn.col]==-1)
{
c[++u]=xn;
a[xn.lin][xn.col]=1+a[c[p].lin][c[p].col];
}
}
++p;
}
}
bool drum (int dist)
{
elem xn;
int p=1,u=0;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
v[i][j]=-1;
c[++u].lin = il;
c[u].col = ic;
if(a[il][ic]<dist)
return false;
v[il][ic] = 0;
while (p<=u)
{
for (i=0;i<4;i++)
{
xn.lin=c[p].lin+dlin[i];
xn.col=c[p].col+dcol[i];
if (a[xn.lin][xn.col]>=dist && v[xn.lin][xn.col] == -1)
{
c[++u]=xn;
v[xn.lin][xn.col]=1+v[c[p].lin][c[p].col];
if(xn.lin==fl && xn.col == fc)
return true;
}
}
++p;
}
return false;
}
int caut()
{
int i,pas=1<<11;
for (i=0;pas!=0;pas/=2)
if (drum(i+pas))
i+=pas;
return i;
}
int main ()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&n,&m);
for (i=1;i<=n;i++)
gets(b[i]+1);
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
if (b[i][j]=='.')
{
a[i][j]=-1;
v[i][j]=-1;
}
if (b[i][j]=='*')
{
a[i][j]=-2;
v[i][j]=-2;
}
if (b[i][j]=='I')
{
a[i][j]=-1;
v[i][j]=0;
il=i;
ic=j;
}
if (b[i][j]=='O')
{
a[i][j]=-1;
v[i][j]=-1;
fl=i;
fc=j;
}
if (b[i][j]=='D')
{
a[i][j]=0;
v[i][j]=-2;
u++;
c[u].lin=i;
c[u].col=j;
}
}
for (i=1;i<=n;i++)
{
a[i][0]=-2;
a[i][m+1]=-2;
v[i][0]=-2;
v[i][m+1]=-2;
}
for (j=1;j<=m;j++)
{
a[0][j]=-2;
a[n+1][j]=-2;
v[0][j]=-2;
v[n+1][j]=-2;
}
//scrie();
lee();
//scrie();
q=caut();
if (q==0) printf("-1");
else printf("%d",q);
return 0;
}