Cod sursa(job #1305)

Utilizator raula_sanChis Raoul raula_san Data 13 decembrie 2006 11:51:40
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.25 kb
#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 Init()
{
	 int i, j;
	 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;
	 for(i=1; i<=N; ++i)
              for(j=1; j<=M; ++j)
			           B[i][j] = -2;
}

void Read()
{
     freopen("barbar.in", "r", stdin); 
	 scanf("%d %d\n", &N, &M);
 
     Init();
     
     int i, j;
     for(i=1; i<=N; ++i)
     {
              scanf("%s", &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;
                       }
                       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 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] == -2)
                         {
									  ++ 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]!=-2?B[lf][cf]:-1);
     fclose(stdout);
}

int main()
{
    Read();
    Shortest_Path();
    Exit();
    Write();
    
    return 0;
}