Pagini recente » Cod sursa (job #714645) | Cod sursa (job #2485614) | Cod sursa (job #2336232) | Cod sursa (job #1938145) | Cod sursa (job #217468)
Cod sursa(job #217468)
#include <stdio.h>
#include <queue>
#include <bitset>
#define inf 32000
using namespace std;
long n,m,i,j,k,x1,x2,y1,y2,x,y,xx,yy;
long dx[]={-1,0,1,0},dy[]={0,1,0,-1};
short int d[1001][1024],v[1001][1024];
char a[1001][1024];
bitset <1024>mk[1001];
queue <short int> Qx,Qy;
int main(){
freopen("barbar.in","r",stdin);freopen("barbar.out","w",stdout);
scanf("%ld %ld\n",&n,&m);
for (i=1;i<=n;++i)
for (j=1;j<=n;++j)
d[i][j]=inf;
for (i=1;i<=n;++i){
scanf("%s\n",a[i]+1);
for (j=1;j<=m;++j)
if (*(a[i]+j)=='D'){Qx.push(i);Qy.push(j);d[i][j]=0;mk[i][j]=1;}
else if (*(a[i]+j)=='I'){x1=i;y1=j;}
else if (*(a[i]+j)=='O'){x2=i;y2=j;}
}
while (!Qx.empty()){
x=Qx.front();Qx.pop();y=Qy.front();Qy.pop();
mk[x][y]=0;
for (k=0;k<4;++k){
xx=x+dx[k];yy=y+dy[k];
if (xx && xx<=n && yy && yy<=m)
if (d[xx][yy]>d[x][y]+1){
d[xx][yy]=d[x][y]+1;
if (!mk[xx][yy]){mk[xx][yy]=1;Qx.push(xx);Qy.push(yy);}
}
}
}
/*for (i=1;i<=n;++i){
for (j=1;j<=m;++j)
printf("%ld ",d[i][j]);
printf("\n");
}*/
Qx.push(x1);Qy.push(y1);v[x1][y1]=d[x1][y1];
while (!Qx.empty()){
x=Qx.front();Qx.pop();y=Qy.front();Qy.pop();
mk[x][y]=0;
for (k=0;k<4;++k){
xx=x+dx[k];yy=y+dy[k];
if (xx && xx<=n && yy && yy<=m)
if (v[xx][yy]<min(v[x][y],d[xx][yy])){
v[xx][yy]=min(v[x][y],d[xx][yy]);
if (!mk[xx][yy]){mk[xx][yy]=1;Qx.push(xx);Qy.push(yy);}
}
}
}
/*for (i=1;i<=n;++i){
for (j=1;j<=m;++j)
printf("%ld ",v[i][j]);
printf("\n");
}*/
printf("%ld\n",v[x2][y2]);
return 0;
}