Cod sursa(job #180618)
#include<stdio.h>
int m,n,i,j,a[12][12],xi,yi,xo,yo,d,cx[101],cy[101],b,t,st,dr,mi,ok;
char h[13][13];
int lee(int dc);
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]='*';
for(j=1;j<=n;j++)h[0][j]=h[m+1][j]='*';
for(i=1;i<=m;i++)scanf("%s",&h[i][1]);
for(i=0;i<=m+1;i++)h[i][n+1]='*';
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{ if(h[i][j]=='.')continue;
if(h[i][j]=='*')continue;
if(h[i][j]=='D'){t++;cx[t]=i;cy[t]=j;a[i][j]=1;continue;}
if(h[i][j]=='I'){xi=i;yi=j;h[i][j]='.';continue;}
xo=i;yo=j;h[i][j]='.';
}
for(b=1;b<=t;b++)
{ i=cx[b];j=cy[b];d=a[i][j];
if(h[i+1][j]=='.'&&!a[i+1][j]){t++;cx[t]=i+1;cy[t]=j;a[i+1][j]=d+1;}
if(h[i-1][j]=='.'&&!a[i-1][j]){t++;cx[t]=i-1;cy[t]=j;a[i-1][j]=d+1;}
if(h[i][j+1]=='.'&&!a[i][j+1]){t++;cx[t]=i;cy[t]=j+1;a[i][j+1]=d+1;}
if(h[i][j-1]=='.'&&!a[i][j-1]){t++;cx[t]=i;cy[t]=j-1;a[i][j-1]=d+1;}
}
st=0;dr=(a[xi][yi]<a[xo][yo])?a[xi][yi]:a[xo][yo];
ok=lee(dr);
if(!ok){printf("-1\n");fcloseall();return 0;}
while(dr-st>1)
{ mi=(st+dr)>>1;
ok=lee(mi);
if(lee(mi))dr=mi;
else st=mi;
}
printf("%d",dr);
fcloseall();
return 0;
}
int lee(int dc)
{ int viz[12][12]={0};
b=t=1;cx[t]=xi;cy[t]=yi;
while(b<=t&&!viz[xo][yo])
{ i=cx[b];j=cy[b];
if(!viz[i+1][j])
{ if(a[i+1][j]<dc||h[i+1][j]!='.')viz[i+1][j]=1;
else {t++;cx[t]=i+1;cy[t]=j;viz[i+1][j]=1;}
}
if(!viz[i-1][j])
{ if(a[i-1][j]<dc||h[i-1][j]!='.')viz[i-1][j]=1;
else {t++;cx[t]=i-1;cy[t]=j;viz[i-1][j]=1;}
}
if(!viz[i][j+1])
{ if(a[i][j+1]<dc||h[i][j+1]!='.')viz[i][j+1]=1;
else {t++;cx[t]=i;cy[t]=j+1;viz[i][j+1]=1;}
}
if(!viz[i][j-1])
{ if(a[i][j-1]<dc||h[i][j-1]!='.')viz[i][j-1]=1;
else {t++;cx[t]=i;cy[t]=j-1;viz[i][j-1]=1;}
}
b++;
}
if(viz[xo][yo])return 1;
return 0;
}