Cod sursa(job #1026447)

Utilizator mariacMaria Constantin mariac Data 11 noiembrie 2013 17:19:01
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <fstream>
#include <queue>

using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

int m[1010][1010],v[1010][1010], r, c, dmax, ok;
int xx[] ={ 0, 0, -1, 1}, yy[] = { -1, 1, 0, 0};

struct per{
    int x, y, d;
    per(){}
    per(int a,int b,int c)
    {
        x = a;
        y = b;
        d = c;
    }
};
per I, O;
queue<per> coada;
queue<per> coada2;
vector<per> lv[1000000];

void dist_min()
{
    while(!coada.empty())
    {
        int x, y, d;
        x = coada.front().x;
        y = coada.front().y;
        d = coada.front().d;
        coada.pop();
        if( d > dmax) dmax = d;
        for( int i = 0; i < 4; i++)
            if(m[ x + xx[i]][y + yy[i]] == 0)
            {
                coada.push( per( x + xx[i], y + yy[i], d + 1));
                m[ x + xx[i]][ y + yy[i]] = d + 1;

            }

    }
}

void drum(int d)
{
    while(!coada2.empty() && !ok)
    {
        int x, y;

        x = coada2.front().x;
        y = coada2.front().y;

        coada2.pop();
        for( int i = 0; i < 4 && !ok; i++)

            if(!v[ x + xx[i]][ y + yy[i]] && m[ x + xx[i]][ y + yy[i]] > 0)
            {
                v[ x + xx[i]][ y + yy[i]] = 1;

                if(m[ x + xx[i]][ y + yy[i]] >= d )
                    coada2.push( per( x + xx[i], y + yy[i], 0));
                else
                    lv[m[ x + xx[i]][ y + yy[i]]].push_back( per( x + xx[i], y + yy[i], 0));
            }
                else if( v[ x + xx[i]][ y + yy[i]] == 2)
                    {
                        fout<<d;
                        ok = 1;
                    }
    }

    if( !ok && d > 1)
    {
        int x, i;
        x = lv[d - 1].size();

        for( i = 0; i < x; i++)
              coada2.push( lv[ d - 1][ i]);

        drum( d - 1);


    }
        else if( !ok) fout<< -1;

}
int main()
{
    int i, j;
    fin>> r>> c;
    char x;
    for(i = 0; i <= c + 1; i++)
    {
        m[ 0][ i] = -1;
        m[ r + 1][ i] = -1;
    }
    for(i = 1; i <= r; i++)
    {
        m[ i][ 0] = -1;
        m[ i][ c + 1] =  -1;
        for( j = 1; j <= c; j++)
        {
            fin>>x;
            m[i][j] = 0;
            if( x == 'D')
            {
                m[i][j] = -2;
                coada.push(per(i,j,0));
            }
            if( x == '*')
                m[ i][ j] = -1;
            if( x == 'I')
                I = per( i, j, 0);
            if( x == 'O')
                O = per( i, j, 0);

        }
    }
    dist_min();
    v[ I.x][ I.y] = 1;
    v[ O.x][ O.y] = 2;
    coada2.push( I);
    if( v[ I.x][ I.y] == 2) fout<< 0;
        else drum( dmax);

    return 0;
}