Pagini recente » Cod sursa (job #2868687) | Cod sursa (job #1378533) | Cod sursa (job #881455) | Cod sursa (job #1287658) | Cod sursa (job #605685)
Cod sursa(job #605685)
#include<stdio.h>
#define N 1001
const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
struct punct {
short x,y;
};
punct q[N*N];
int n,m,x1,y1,u,p=1;
char a[N];
short x[N][N],x2,y2;
int yy[N][N],z[N][N];
void aa() {
for(int ii=1;ii<=n;++ii)
for(int j=1;j<=m;++j)
z[ii][j]=0;
}
void bfs1() {
punct y,xx;
int i;
while(u>=p) {
xx=q[p++];
for(i=0;i<=3;++i) {
y.x=xx.x+dx[i];
y.y=xx.y+dy[i];
if(x[y.x][y.y]!=-1 && yy[y.x][y.y]==-1) {
yy[y.x][y.y]=1+yy[xx.x][xx.y];
q[++u]=y;
}
}
}
}
bool verbfs(int w) {
u=1; p=1;
int i;
punct xx,y;
while(u>=p) {
xx=q[p++];
for(i=0;i<=3;++i) {
y.x=xx.x+dx[i];
y.y=xx.y+dy[i];
if(y.x>0 && y.x<=n && y.y>0 && y.y<=m && x[y.x][y.y]!=-1 && z[y.x][y.y]==0 && yy[y.x][y.y]>=w) {
q[++u]=y;
z[y.x][y.y]=1+z[xx.x][xx.y];
}
}
}
if(z[x2][y2]!=0)
return 1;
return 0;
}
int main() {
int i,j,pas=1<<14;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i) {
scanf("%s",&a);
for(j=0;j<m;++j) {
yy[i][j+1]=-1;
if(a[j]=='.')
x[i][j+1]=0;
if(a[j]=='*') {
x[i][j+1]=-1;
}
if(a[j]=='D') {
q[++u].x=i; q[u].y=j+1;
yy[i][j+1]=0;
x[i][j+1]=1;
}
if(a[j]=='I') {
x1=i; y1=j+1;
x[i][j+1]=1;
}
if(a[j]=='O') {
x2=i; y2=j+1;
}
}
}
bfs1();
q[1].x=x1; q[1].y=y1;
if(!verbfs(0)) {
printf("-1");
return 0;
}
for(i=0;pas!=0;pas>>=1) {
aa();
if(i+pas<n*m && verbfs(i+pas))
i+=pas;
}
if(yy[x2][y2]<i)
i=yy[x2][y2];
if(yy[x1][y1]<i)
i=yy[x1][y1];
printf("%d",i);
return 0;
}