Cod sursa(job #1026407)

Utilizator mariacMaria Constantin mariac Data 11 noiembrie 2013 16:30:55
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.46 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 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();
        coada2.push(I);
        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')
            {
                per aux;
                aux.x = i;
                aux.y = j;
                aux.d = 0;
                m[i][j] = -2;
                coada.push(aux);
            }
            if( x == '*')
                m[i][j] = -1;
            if( x == 'I')
                {
                    I.x = i;
                    I.y = j;
                    m[i][j] = -1;
                }
            if( x == 'O')
            {
                O.x = i;
                O.y = j;
                m[i][j] = -1;
            }
        }
    }
    dist_min();
    v[O.x][O.y] = 2;
    coada2.push( I);
    drum( dmax);

    return 0;
}