Pagini recente » Cod sursa (job #1840983) | Cod sursa (job #3030345) | Cod sursa (job #2170040) | Cod sursa (job #1935979) | Cod sursa (job #217492)
Cod sursa(job #217492)
#include <stdio.h>
#include <queue>
#include <bitset>
#define inf 32000
using namespace std;
long n,m,i,j,k,f,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");
}*/
v[x2][y2]=-1;
Qx.push(x1);Qy.push(y1);v[x1][y1]=d[x1][y1];mk[x1][y1]=1;
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 (a[xx][yy]!='*'){
f=min(v[x][y],d[xx][yy]);
if (v[xx][yy]<f){
v[xx][yy]=f;
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");
}*/
if (v[x2][y2]==inf || v[x2][y2]==-1)printf("-1\n");
else printf("%d\n",v[x2][y2]);
return 0;
}