Cod sursa(job #1026432)

Utilizator mariacMaria Constantin mariac Data 11 noiembrie 2013 17:02:01
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.78 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;
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())
    {
        per aux;
        aux = coada.front();
        coada.pop();
        if( aux.d > dmax) dmax = aux.d;
        if(m[aux.x - 1][aux.y] == 0)
        {
            per aux1;
            aux1 = aux;
            aux1.x -= 1;
            aux1.d++;
            coada.push(aux1);
            m[aux1.x][aux1.y] = aux1.d;

        }
        if(m[aux.x + 1][aux.y] == 0)
        {
            per aux1;
            aux1 = aux;
            aux1.x += 1;
            aux1.d++;
            coada.push(aux1);
            m[aux1.x][aux1.y] = aux1.d;
        }
        if(m[aux.x][aux.y - 1] == 0)
        {
            per aux1;
            aux1 = aux;
            aux1.y -= 1;
            aux1.d++;
            coada.push(aux1);
            m[aux1.x][aux1.y] = aux1.d;
        }
        if(m[aux.x][aux.y + 1] == 0)
        {
            per aux1;
            aux1 = aux;
            aux1.y += 1;
            aux1.d++;
            coada.push(aux1);
            m[aux1.x][aux1.y] = aux1.d;
        }



    }
}

void drum(int d)
{
    while(!coada2.empty() && !ok)
    {
        per aux;
        aux = coada2.front();
        coada2.pop();
        v[aux.x][aux.y] = 1;

        if(!v[aux.x + 1][aux.y] && m[aux.x + 1][aux.y] > 0)
        {
            v[aux.x + 1][aux.y] = 1;
            per aux1;
            aux1 = aux;
            aux1.x += 1;

            if(m[aux.x + 1][aux.y] >= d )
                coada2.push(aux1);
            else
                lv[m[aux.x + 1][aux.y]].push_back(aux1);
        }
            else if(v[aux.x + 1][aux.y] == 2)
                {
                    fout<<d;
                    ok = 1;
                }
        if(!v[aux.x - 1][aux.y] && m[aux.x -1][aux.y] > 0)
        {
            v[aux.x - 1][aux.y] = 1;
            per aux1;
            aux1 = aux;
            aux1.x -= 1;

            if(m[aux.x - 1][aux.y] >= d )
                coada2.push(aux1);
            else
                lv[m[aux.x - 1][aux.y]].push_back(aux1);
        }
            else if(v[aux.x - 1][aux.y] == 2)
                {
                    fout<<d;
                    ok = 1;
                }
        if(!v[aux.x][aux.y - 1] && m[aux.x][aux.y - 1] > 0)
        {
            v[aux.x][aux.y - 1] = 1;
            per aux1;
            aux1 = aux;
            aux1.y -= 1;

            if(m[aux.x][aux.y -1] >= d )
                coada2.push(aux1);
            else
                lv[m[aux.x ][aux.y -1]].push_back(aux1);
        }
            else if(v[aux.x][aux.y - 1] == 2)
                {
                    fout<<d;
                    ok = 1;
                }

        if(!v[aux.x][aux.y + 1] && m[aux.x][aux.y + 1] > 0)
        {
            v[aux.x][aux.y + 1] = 1;
            per aux1;
            aux1 = aux;
            aux1.y += 1;

            if(m[aux.x][aux.y + 1] >= d )
                coada2.push(aux1);
            else
                lv[m[aux.x ][aux.y + 1]].push_back(aux1);

        }
            else if(v[aux.x][aux.y + 1] == 2)
                {
                    fout<<d;
                    ok = 1;
                }
    }
   if( !ok)
    {
        int x, i;
        x = lv[d - 1].size();

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

        if(d > 1)drum( d - 1);
            else 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;
            if( 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.x = i;
                    I.y = j;
                    m[ i][ j] = 0;
                }
            if( x == 'O')
            {
                O.x = i;
                O.y = j;
                m[ i][ j] = 0;
            }
        }
    }
    dist_min();
    v[ O.x][ O.y] = 2;
    coada2.push( I);
    if( v[ I.x][ I.y] == 2) fout<< 0;
        else drum( dmax);

    return 0;
}