Cod sursa(job #1022973)

Utilizator matei_cChristescu Matei matei_c Data 6 noiembrie 2013 11:37:09
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.5 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std ;

#define maxn 1005
#define maxcoada 1000005
#define nrdir 4

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

int R, C ;
int xs, ys, xi, yi ;

char harta[maxn][maxn] ;
int dist[maxn][maxn], dmax ;
bool ok[maxn][maxn] ;

queue< pair< int, int >> dd ;

queue< pair< int, int >> coada[2 * maxn] ;

void clear_ok()
{
    for(int i = 1; i <= R; ++i )
        for(int j = 0; j < C; ++j )
            ok[i][j] = false ;
}

int main()
{
    freopen("barbar.in", "r", stdin);
    freopen("barbar.out", "w", stdout);

    scanf("%d%d\n", &R, &C);

    for(int i = 1; i <= R; ++i )
        scanf("%s\n", harta[i]);

    for(int i = 1; i <= R; ++i )
    {
        for(int j = 0; j < C; ++j )
        {
            if( harta[i][j] == 'D' )
                dd.push( make_pair( i, j ) ) ;

            if( harta[i][j] == 'I' )
                xs = i, ys = j ;

            if( harta[i][j] == '0' )
                xi = i, yi = j ;
        }
    }

    while( dd.empty() == false )
    {
        int lin = dd.front().first ;
        int col = dd.front().second ;

        for(int i = 0; i < nrdir; ++i )
        {

            int xn = lin + dx[i] ;
            int yn = col + dy[i] ;

            if( xn >= 1 && xn <= R && yn >= 0 && yn < C )
            {
                if( harta[xn][yn] != '*' && harta[xn][yn] != 'D' )
                {
                    if( dist[xn][yn] == 0 )
                    {
                        dist[xn][yn] = dist[lin][col] + 1 ;

                        dmax = max( dmax, dist[xn][yn] ) ;

                        dd.push( make_pair( xn, yn ) ) ;
                    }
                }
            }
        }


        dd.pop() ;
    }
    /*
    for(int i = 1; i <= R; ++i )
    {
        for(int j = 0; j < C; ++j )
            printf("%d ", dist[i][j]) ;

        printf("\n");
    }
    */
    for(int i = 1; i <= R; ++i )
        for(int j = 0; j < C; ++j )
            if( dist[i][j] == dmax )
                for(int k = 1; k <= dmax; ++k )
                    coada[k].push( make_pair( i, j ) ) ;

    bool start = false ;
    bool stop = false ;

    for(int distanta = dmax; distanta > 0; --distanta )
    {


        while( coada[distanta].empty() == false )
        {
            int lin = coada[distanta].front().first ;
            int col = coada[distanta].front().second ;
            ok[lin][col] = true;

            for(int i = 0; i < nrdir; ++i )
            {

                int xn = lin + dx[i] ;
                int yn = col + dy[i] ;

                if( xn >= 1 && xn <= R && yn >= 0 && yn < C )
                {
                    if( harta[xn][yn] != '*' && harta[xn][yn] != 'D' )
                    {
                        if( dist[xn][yn] >= distanta && ok[xn][yn] == false )
                        {
                            coada[distanta].push( make_pair( xn, yn ) ) ;

                            if( xn == xs && yn == ys )
                                start = true ;

                            if( xn == xi && yn == yi )
                                stop = true ;
                        }
                    }
                }

                if( start == true && stop == true )
                {
                    printf("%d\n", distanta);
                    return 0 ;
                }
            }
        }
    }

    return 0 ;
}