Pagini recente » Cod sursa (job #536354) | Cod sursa (job #3039408) | Cod sursa (job #32886) | Cod sursa (job #2177203) | Cod sursa (job #371113)
Cod sursa(job #371113)
#include<stdio.h>
#define DIM 1005
struct coada
{
int x,y;
} c[DIM*DIM],r;
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
int a[DIM][DIM],b[DIM][DIM],x1,x2,y1,y2,n,m;
void show ()
{
int i,j;
for(i=1;i<=n;++i,printf("\n"))
for(j=1;j<=m;++j)
printf("%d ",a[i][j]);
printf("\n");
for(i=1;i<=n;++i,printf("\n"))
for(j=1;j<=m;++j)
printf("%d ",b[i][j]);
printf("\n");
}
int check (int x)
{
int st=1,dr=1,i;
c[st].x=x1,c[st].y=y1;
while(st<=dr)
{
r=c[st];
for(i=0;i<4;++i)
if(b[r.x+dx[i]][r.y+dy[i]]>=x+1 && a[r.x+dx[i]][r.y+dy[i]]==0)
{
a[r.x+dx[i]][r.y+dy[i]]=1;
c[++dr].x=r.x+dx[i];
c[dr].y=r.y+dy[i];
}
++st;
}
if(a[x2][y2]==1)
return 1;
return 0;
}
int main ()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int i,j,st=1,dr=0,max=0;
char ch;
scanf("%d%d\n",&n,&m);
for(i=1;i<=n;++i,scanf("\n"))
for(j=1;j<=m;++j)
{
scanf("%c",&ch);
if(ch=='*')
a[i][j]=b[i][j]=-2;
if(ch=='D')
{
a[i][j]=-1;
b[i][j]=1;
c[++dr].x=i;
c[dr].y=j;
}
else if (ch=='I')
x1=i,y1=j;
else if (ch=='O')
x2=i,y2=j;
}
for(i=0;i<=n+1;++i)
a[i][0]=a[i][m+1]=b[i][0]=b[i][m+1]=-1;
for(i=0;i<=m+1;++i)
a[0][i]=a[n+1][i]=b[0][i]=b[n+1][i]=-1;
while(st<=dr)
{
r=c[st];
for(i=0;i<4;++i)
if(b[r.x+dx[i]][r.y+dy[i]]==0)
{
b[r.x+dx[i]][r.y+dy[i]]=b[r.x][r.y]+1;
c[++dr].x=r.x+dx[i];
c[dr].y=r.y+dy[i];
}
++st;
}
c[st=1].x=x1;
c[dr=1].y=y1;
while(st<=dr)
{
r=c[st];
for(i=0;i<4;++i)
if(a[r.x+dx[i]][r.y+dy[i]]==0)
{
a[r.x+dx[i]][r.y+dy[i]]=a[r.x][r.y]+1;
c[++dr].x=r.x+dx[i];
c[dr].y=r.y+dy[i];
}
++st;
}
if(a[x2][y2]==0)
{
printf("-1");
return 0;
}
st=0,dr=n+m;
int mij;
while(st<=dr)
{
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
if(a[i][j]>0)
a[i][j]=0;
mij=(st+dr)/2;
if(check(mij))
max=mij,st=mij+1;
else
dr=mij-1;
}
printf("%d",max);
return 0;
}