Pagini recente » Cod sursa (job #2726239) | Cod sursa (job #499348) | Cod sursa (job #2690448) | Cod sursa (job #2801797) | Cod sursa (job #2672037)
#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, 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;
}