Pagini recente » Cod sursa (job #2336262) | Cod sursa (job #2755969) | Autentificare | Cod sursa (job #2794619) | Cod sursa (job #2672038)
#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, safe[M1][M1], sol[M1][M1], xi, yi, xf, yf, x0, y0, x1, y1;
int 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++) {
safe[i][j]=INF;
sol[i][j]=0;
scanf ("%c", &t[i][j]);
if (t[i][j]=='D') { safe[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]!='*' && safe[x1][y1]>safe[x0][y0]+1) {
safe[x1][y1]=safe[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;
sol[xi][yi]=safe[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(sol[x0][y0], safe[x1][y1]);
if (sol[x1][y1]<xi) {
sol[x1][y1]=xi;
cd=(cd+1)%M2;
cx[cd]=x1;
cy[cd]=y1; } } }
cs=(cs+1)%M2; }
if (sol[xf][yf]>0)
printf ("%d\n", sol[xf][yf]);
else
printf ("-1\n");
return 0;
}