Pagini recente » Cod sursa (job #1267076) | Cod sursa (job #241899) | Cod sursa (job #1152176) | Cod sursa (job #1042431) | Cod sursa (job #2610692)
#include <stdio.h>
#define M1 1005
#define M2 1000005
#define INF 1000000
const int dx[4]={0, 0, -1, 1}, dy[4]={-1, 1, 0, 0};
int minim(int a, int b){
return a<b?a:b;
}
int n, m, i, j, m1[M1][M1], m2[M1][M1], xi, yi, xf, yf, x0, y0, x1, y1, cx[M2], cy[M2], cs, cd;
char t[M1][M1];
int main(){
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
scanf("%d %d\n", &n, &m);
cs=0;
cd=-1;
for(i=1; i<=n; i++){
for(j=1; j<=m; j++){
m1[i][j]=INF;
m2[i][j]=0;
t[i][j]=fgetc(stdin);
if(t[i][j]=='D'){
m1[i][j]=0;
cd++;
cx[cd]=i;
cy[cd]=j;
}
if(t[i][j]=='I'){
xi=i;
yi=j;
}
if(t[i][j]=='O'){
xf=i;
yf=j;
}
}
scanf("\n");
}
for(i=0; i<=n+1; i++){
t[i][0]='*';
t[i][m+1]='*';
}
for(i=0; i<=m+1; i++){
t[0][i]='*';
t[n+1][i]='*';
}
while(cs!=cd+1){
for(i=0; i<4; i++){
x0=cx[cs];
y0=cy[cs];
x1=x0+dx[i];
y1=y0+dy[i];
if(t[x1][y1]!='*' && m1[x1][y1]>m1[x0][y0]+1){
m1[x1][y1]=m1[x0][y0]+1;
cd=(cd+1)%M2;
cx[cd]=x1;
cy[cd]=y1;
}
}
cs=(cs+1)%M2;
}
cs=cd=0;
cx[0]=xi;
cy[0]=yi;
m2[xi][yi]=m1[xi][yi];
while(cs!=cd+1){
for(i=0; i<4; i++){
x0=cx[cs];
y0=cy[cs];
x1=x0+dx[i];
y1=y0+dy[i];
if(t[x1][y1]!='*'){
xi=minim(m2[x0][y0], m1[x1][y1]);
if(m2[x1][y1]<xi){
m2[x1][y1]=xi;
cd=(cd+1)%M2;
cx[cd]=x1;
cy[cd]=y1;
}
}
}
cs=(cs+1)%M2;
}
if(m2[xf][yf]>0)
printf("%d\n", m2[xf][yf]);
else
printf("-1\n");
return 0;
}