Cod sursa(job #1745034)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 21 august 2016 00:11:02
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.73 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>

#define BORDER -2
#define UNUSED 1000000000
#define lin dragon[0].x
#define col dragon[0].y
#define dist dragon[0].d
#define L carare[0].x
#define C carare[0].y

struct date
{
    int x;
    int y;
    int d;
};

struct date Zona( int l, int c, int d )
{
    struct date zona;

    zona.x=l;
    zona.y=c;
    zona.d=d;

    return zona;
}

struct date Zona( int l, int c )
{
    struct date zona;

    zona.x=l;
    zona.y=c;
    zona.d=0;
    return zona;
}


std::deque<struct date> dragon;

int mat[1005][1005], cpy[1005][1005];

int dl[5]={ -1, 0, 1, 0 };
int dc[5]={ 0, 1, 0, -1 };

using namespace std;

int cale( int k, int il, int ic, int ol, int oc )
{
    deque<struct date>carare;

    int i;

    memcpy(cpy,mat,sizeof(cpy));
    carare.push_back(Zona(il,ic));

    while( carare.size() && (L!=ol || C!=oc) )
    {
        if( cpy[L][C]!=BORDER && cpy[L][C]>=k )
        {
            for( i=0;i<4;i++ )
                carare.push_back(Zona(L+dl[i],C+dc[i]));
        }

        cpy[L][C]=BORDER;

        carare.pop_front();
    }

    return carare.size()>0;

}

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

    int n, m, il, ic, ol, oc, pas, i, j;
    char k;

    scanf( "%d%d\n", &n, &m );

    for( i=1;i<=n;i++ )
    {
        for( j=1;j<=m;j++ )
        {
            scanf( "%c", &k );
            mat[i][j]=UNUSED;

            if( k=='I' )
            {
                il=i;
                ic=j;

            }
            else
                if( k=='O' )
                {
                    ol=i;
                    oc=j;
                }
                else
                    if( k=='D' )
                    {
                        dragon.push_back(Zona(i,j,0));
                    }
                    else
                        if( k=='*' )
                        {
                            mat[i][j]=BORDER;
                        }
        }
        scanf( "\n" );
    }

    for( i=0;i<=n+1;i++ )
    {
        mat[i][0]=BORDER;
        mat[i][m+1]=BORDER;
    }
    for( j=0;j<=m+1;j++ )
    {
        mat[0][j]=BORDER;
        mat[n+1][j]=BORDER;
    }

    while( dragon.size() )
    {
        if( mat[lin][col]==UNUSED )
        {
            for( i=0;i<4;i++ )
                dragon.push_back(Zona(lin+dl[i],col+dc[i],dist+1));

            mat[lin][col]=dist;

        }

        dragon.pop_front();
    }

    i=-1;

    for( pas=(1<<20); pas>0; pas>>=1 )
        if( cale(pas+i,il,ic,ol,oc)==1 )
            i+=pas;

    printf( "%d", i );

    return 0;
}