Pagini recente » Cod sursa (job #143412) | Cod sursa (job #751650) | Cod sursa (job #3288747) | Monitorul de evaluare | Cod sursa (job #721)
Cod sursa(job #721)
#include<cstdio>
#include<cstring>
#define dim 1024
#define INF 0x3f3f3f3f
int N, M;
char S[dim];
struct POSITION
{ int x, y; } C[2*dim*dim];
long incC = 1, sfC, A[dim][dim], B[dim][dim];
int li, ci, lf, cf;
const int dx[] = {0, 0, -1, 1};
const int dy[] = {-1, 1, 0, 0};
void Read()
{
freopen("barbar.in", "r", stdin);
scanf("%d %d\n", &N, &M);
int i, j;
for(i=1; i<=N; ++i)
{
gets(S);
for(j=0; j<strlen(S); ++j)
if(S[j] == '.')
A[i][j+1] = INF;
else if(S[j] == 'D')
{
++ sfC;
C[sfC].x = i; C[sfC].y = j + 1;
A[i][j+1] = 0, B[i][j+1] = -1;
}
else if(S[j] == '*')
A[i][j+1] = B[i][j+1] = -1;
else
{
if(S[j] == 'I')
li = i, ci = j + 1, A[i][j+1] = INF;
if(S[j] == 'O')
lf = i, cf = j + 1, A[i][j+1] = INF;
}
}
}
void Init()
{
int i;
for(i=0; i<=N+1; ++i)
A[i][0] = A[i][M+1] = B[i][0] = B[i][M+1] = -1;
for(i=0; i<=M+1; ++i)
A[0][i] = A[N+1][i] = B[0][i] = B[N+1][i] = -1;
}
void Shortest_Path()
{
while(incC <= sfC)
{
int i, xi, yi;
for(i=0; i<4; ++i)
{
xi = C[incC].x + dx[i];
yi = C[incC].y + dy[i];
if(A[xi][yi] > 0 && A[xi][yi] > A[C[incC].x][C[incC].y] + 1)
{
++ sfC;
C[sfC].x = xi; C[sfC].y = yi;
A[xi][yi] = A[C[incC].x][C[incC].y] + 1;
}
}
++ incC;
}
}
void Exit()
{
incC = sfC = 1; C[incC].x = li; C[incC].y = ci;
B[li][ci] = A[li][ci];
while(incC <= sfC)
{
int i, xi, yi;
for(i=0; i<4; ++i)
{
xi = C[incC].x + dx[i];
yi = C[incC].y + dy[i];
if(!B[xi][yi])
{
++ sfC;
C[sfC].x = xi; C[sfC].y = yi;
B[xi][yi] = B[C[incC].x][C[incC].y] < A[xi][yi] ? B[C[incC].x][C[incC].y] : A[xi][yi];
}
else if(B[xi][yi] != -1 && B[C[incC].x][C[incC].y] > B[xi][yi] && B[C[incC].x][C[incC].y] <= A[xi][yi])
{
++ sfC;
C[sfC].x = xi; C[sfC].y = yi;
B[xi][yi] = B[C[incC].x][C[incC].y];
}
}
B[li][ci] = -1;
++ incC;
}
}
void Write()
{
freopen("barbar.out", "w", stdout);
printf("%ld", B[lf][cf]?B[lf][cf]:-1);
fclose(stdout);
}
int main()
{
Read();
Init();
Shortest_Path();
Exit();
Write();
return 0;
}