Pagini recente » Cod sursa (job #2663973) | Cod sursa (job #1031465) | Cod sursa (job #2509914) | Cod sursa (job #427735) | Cod sursa (job #499176)
Cod sursa(job #499176)
#include<stdio.h>
#include<string.h>
int m,n,i,j,a[1024][1024],viz[1024][1024],viz0[1024][1024],xi,yi,xo,yo,d,
cx[1000010],cy[1000010],b,t,st,dr,mi,ok,ii,jj;
char h[1024][1024];
void fill();
int main()
{
freopen("barbar.in","rt",stdin);
freopen("barbar.out","wt",stdout);
scanf("%d%d",&m,&n);
for(i=0;i<=m+1;i++){h[i][0]='*';viz0[i][0]=1;}
for(j=1;j<=n;j++)
{ h[0][j]=h[m+1][j]='*';viz0[0][j]=viz0[m+1][j]=1;}
for(i=1;i<=m;i++)scanf("%s",&h[i][1]);
for(i=0;i<=m+1;i++){h[i][n+1]='*';viz0[i][n+1]=1; }
for(i=0;i<=m+1;i++)
for(j=0;j<=n+1;j++)
{ if(h[i][j]=='.')continue;
if(h[i][j]=='*'){a[i][j]=1;viz0[i][j]=1;continue;}
if(h[i][j]=='D')
{t++;cx[t]=i;cy[t]=j;a[i][j]=2;continue;}
if(h[i][j]=='I'){xi=i;yi=j;continue;}
xo=i;yo=j;
}
for(b=1;b<=t;b++)
{ i=cx[b];j=cy[b];d=a[i][j];
if(!a[i+1][j]){t++;cx[t]=i+1;cy[t]=j; a[i+1][j]=d+1;}
if(!a[i-1][j]){t++;cx[t]=i-1;cy[t]=j; a[i-1][j]=d+1;}
if(!a[i][j+1]){t++;cx[t]=i; cy[t]=j+1;a[i][j+1]=d+1;}
if(!a[i][j-1]){t++;cx[t]=i; cy[t]=j-1;a[i][j-1]=d+1;}
}
mi=2;
for(i=0;i<=m+1;i++)
for(j=0;j<=n+1;j++)
viz[i][j]=viz0[i][j];
fill();
if(!viz[xo][yo]){printf("-1\n");fcloseall();return 0;}
st=2;dr=1000005;
while(dr-st>1)
{ mi=(st+dr)>>1;
for(i=0;i<=m+1;i++)
for(j=0;j<=n+1;j++)
viz[i][j]=viz0[i][j];
fill();
if(viz[xo][yo])
st=mi;
else
dr=mi;
}
printf("%d",st-2);
fcloseall();
return 0;
}
void fill()
{ if(a[xi][yi]<mi)return;
t=1; b=1; cx[t]=xi; cy[t]=yi; viz[xi][yi]=1;
for(b=1;b<=t;b++)
{
i=cx[b]; j=cy[b];
if(!viz[i-1][j]&&a[i-1][j]>=mi){ viz[i-1][j]=1; t++; cx[t]=i-1; cy[t]=j;}
if(!viz[i+1][j]&&a[i+1][j]>=mi){ viz[i+1][j]=1; t++; cx[t]=i+1; cy[t]=j;}
if(!viz[i][j-1]&&a[i][j-1]>=mi){ viz[i][j-1]=1; t++; cx[t]=i; cy[t]=j-1;}
if(!viz[i][j+1]&&a[i][j+1]>=mi){ viz[i][j+1]=1; t++; cx[t]=i; cy[t]=j+1;}
}
}