Pagini recente » Cod sursa (job #2437633) | Cod sursa (job #1522518) | Cod sursa (job #2262777) | Cod sursa (job #1077712) | Cod sursa (job #371119)
Cod sursa(job #371119)
#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 maxim (int a,int b)
{
if(a>b)
return b;
return a;
}
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;
max=b[x1][y1];
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=maxim(max,mij),st=mij+1;
else
dr=mij-1;
}
printf("%d",max+1);
return 0;
}