Cod sursa(job #1053043)

Utilizator DragosGGeornoiu Dragos DragosG Data 12 decembrie 2013 01:58:51
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include<iostream>
#include<fstream>
#include <queue>

int N,M;
int xi, yi, xf, yf;
int sc;
int ic;
int x,y;
int ok, matrice_max = -1;

int matrice[1005][1005], matrice2[1005][1005];
int X[1000005], Y[1000005];

#define nmax 1005

int dx[] = { 0, 1, 0, -1};
int dy[] = { 1, 0, -1, 0};

void citire()
{
	char c;
	std::cin>>N>>M;
  
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= M; j++)
        {
			std::cin>>c;
             
            matrice[i][j] = nmax;
             
            if( c == '*' )
                matrice[i][j] = 0;                
            else
                if( c == 'D' )
                {
                    matrice[i][j] = 0;
                    ++sc;                             
                    X[sc] = i;
                    Y[sc] = j;
                }
                else
                    if( c == 'I' )
                    {
                         
                        xi = i;
                        yi = j;
                    }
                    else
                        if( c == 'O' )
                        {
                            xf = i;
                            yf = j;
                        }
        }

}

void umplere()
{
     for ( ic = 1; ic <= sc; ic++ )
        for (int i = 0, x = X[ic], y = Y[ic]; i < 4; i++ )
            if (matrice[x + dx[i]][y + dy[i]] > matrice[x][y]+1 && x+dx[i] >= 1 && x+dx[i] <= N && y+dy[i] >= 1 && y+dy[i] <= M)
            {
                matrice[x + dx[i]][y + dy[i]] = matrice[x][y] + 1;
                sc++;
                X[sc] = x + dx[i];
                Y[sc] = y + dy[i];
            }
}

int drum( int m )
{
    if (matrice[xi][yi] < m || matrice[xf][yf] < m) 
        return 0;
  
    for ( ic = sc = 0, X[ic] = xi, Y[ic] = yi; ic <= sc && matrice2[xf][yf] != m; ic++)
    {
        x = X[ic];
        y = Y[ic];
  
        for (int i = 0; i < 4; ++i)
            if (x+dx[i] >= 1 && x+dx[i] <= N && y+dy[i] >= 1 && y+dy[i] <= M && matrice2[x + dx[i]][y + dy[i]] != m && matrice[x+dx[i]][y+dy[i]] >= m)
            {
                sc++;
                X[sc] = x+dx[i];
                Y[sc] = y+dy[i];
                matrice2[x+dx[i]][y+dy[i]] = m;
            }
    }
  
    if (matrice2[xf][yf] == m) 
        return 1;
  
    return 0;
}

void rezolvare(int m)
{
   
 
  
    {
        if( ! drum(m) )
            rezolvare(m-1);
        else if (matrice_max != m)
        {
            matrice_max = m;
            rezolvare(m+1);
         
        }
    }
}

int main()
{
    citire();
    umplere();
    int max = M;
    if( N>M )
        max=N;
  
    rezolvare(matrice[xi][yi]);
	std::cout<<matrice_max;
  
   

	system("pause");

	 return 0;
}