Pagini recente » Cod sursa (job #2141159) | Cod sursa (job #2365020) | Cod sursa (job #2769206) | Cod sursa (job #555982) | Cod sursa (job #829073)
Cod sursa(job #829073)
#include <stdio.h>
#include<string.h>
int n,m;
char x[1010][1010];
int d[1010][1010];
int b[1010][1010];
struct sp
{
int l;
int c;
} c[2000000],s,f;
int st,sf;
int md;
int inborder(int l,int c)
{
if(l<1||l>n)
return 0;
if(c<1||c>m)
return 0;
return 1;
}
void lee_d()
{
st=1;
while(st<=sf)
{
if(d[c[st].l][c[st].c]>md)
md=d[c[st].l][c[st].c];
if(inborder(c[st].l+1,c[st].c))
{
if(!d[ c[st].l + 1 ][ c[st].c ] && x[c[st].l + 1][c[st].c]!='*')
{
c[++sf].l=c[st].l + 1;
c[sf].c=c[st].c;
d[c[sf].l][c[sf].c]=d[c[st].l][c[st].c]+1;
}
}
if(inborder(c[st].l-1,c[st].c))
{
if(!d[ c[st].l - 1 ][ c[st].c ] && x[c[st].l - 1][c[st].c]!='*')
{
c[++sf].l=c[st].l - 1;
c[sf].c=c[st].c;
d[c[sf].l][c[sf].c]=d[c[st].l][c[st].c]+1;
}
}
if(inborder(c[st].l,c[st].c+1))
{
if(!d[ c[st].l ][ c[st].c + 1 ] && x[c[st].l ][c[st].c+1]!='*')
{
c[++sf].l=c[st].l;
c[sf].c=c[st].c+1;
d[c[sf].l][c[sf].c]=d[c[st].l][c[st].c]+1;
}
}
if(inborder(c[st].l,c[st].c-1))
{
if(!d[ c[st].l ][ c[st].c - 1 ] && x[c[st].l ][c[st].c-1]!='*')
{
c[++sf].l=c[st].l;
c[sf].c=c[st].c-1;
d[c[sf].l][c[sf].c]=d[c[st].l][c[st].c]+1;
}
}
st++;
}
}
int drum(int x)
{
while(st<=sf)
{
if(c[st].l==f.l&&c[st].c==f.c)
return 1;
if(inborder(c[st].l+1,c[st].c))
{
if(!b[ c[st].l + 1 ][ c[st].c ] && d[c[st].l + 1][c[st].c]>=x+1)
{
c[++sf].l=c[st].l + 1;
c[sf].c=c[st].c;
b[c[sf].l][c[sf].c]=b[c[st].l][c[st].c]+1;
}
}
if(inborder(c[st].l-1,c[st].c))
{
if(!b[ c[st].l - 1 ][ c[st].c ] && d[c[st].l - 1][c[st].c]>=x+1)
{
c[++sf].l=c[st].l - 1;
c[sf].c=c[st].c;
b[c[sf].l][c[sf].c]=b[c[st].l][c[st].c]+1;
}
}
if(inborder(c[st].l,c[st].c+1))
{
if(!b[ c[st].l ][ c[st].c + 1 ] && d[c[st].l ][c[st].c+1]>=x+1)
{
c[++sf].l=c[st].l;
c[sf].c=c[st].c+1;
b[c[sf].l][c[sf].c]=b[c[st].l][c[st].c]+1;
}
}
if(inborder(c[st].l,c[st].c-1))
{
if(!b[ c[st].l ][ c[st].c - 1 ] && d[c[st].l ][c[st].c-1]>=x+1)
{
c[++sf].l=c[st].l;
c[sf].c=c[st].c-1;
b[c[sf].l][c[sf].c]=b[c[st].l][c[st].c]+1;
}
}
st++;
}
return 0;
}
int rez;
void bs(int start,int final)
{
if(start>final)
return;
int mij=(start+final)/2;
memset(c,0,sizeof(c));
memset(b,0,sizeof(b));
c[1]=s;
st=1;
sf=1;
int a=drum(mij);
if(!a)
bs(start,mij-1);
else
{
if(mij>rez)
rez=mij;
bs(mij+1,final);
}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d%c",&n,&m,&x[0][0]);
for(int i=1;i<=n;i++)
{
x[i][0]=' ';
gets(x[i]+1);
for(int j=1;j<=m;j++)
if(x[i][j]=='I')
{
s.l=i;
s.c=j;
x[i][j]='.';
}
else if(x[i][j]=='O')
{
f.l=i;
f.c=j;
x[i][j]=',';
}
else if(x[i][j]=='D')
{
c[++sf].l=i;
c[sf].c=j;
x[i][j]='.';
d[i][j]=1;
}
}
lee_d();
// printf("%d\n",md);
/* for(int i=1;i<=n;i++,printf("\n"))
for(int j=1;j<=m;j++)
{
printf("%d ",d[i][j]);
}*/
bs(0,md);
printf("%d",rez);
return 0;
}