Cod sursa(job #2321429)

Utilizator andrei5000Andrei Alin andrei5000 Data 16 ianuarie 2019 08:04:31
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.96 kb
#include <fstream>
#include <queue>

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");
short viz[1002][1002];
short M[1002][1002],i,j,px,py,L,C,ox,oy,dim[10000];
char chr;
queue <short> x[10000],y[10000];

void afis(){
    for(short o=1;o<=L;++o){
        for(short k=1;k<=C;++k)
        g << M[o][k] << " ";
    g << "\n";}
}

void afisviz(){
    for(short o=1;o<=L;++o){
        for(short k=1;k<=C;++k)
        g << viz[o][k] << " ";
    g << "\n";}
}

int main()
{
    f >> L >> C;

    for(i=0;i<=L+1;++i){
         M[i][0] = -1;
         M[i][C+1] = -1;}

    for(i=0;i<=C+1;++i){
         M[0][i] = -1;
         M[L+1][i] = -1;}


    for(i=1;i<=L;++i)
        for(j=1;j<=C;++j){
        f >> chr;
        if(chr!='.')
            if(chr=='D') {x[0].push(i); y[0].push(j); M[i][j]=1; ++dim[0];}
              else if(chr=='*') M[i][j] = -1;
                else if(chr=='I') {px = i; py = j;}
                 else {ox = i; oy = j;}
        }

    while(dim[0]!=0){
        if(M[x[0].front()+1][y[0].front()]==0){
             M[x[0].front()+1][y[0].front()]= M[x[0].front()][y[0].front()]+1;
             x[0].push(x[0].front()+1);
             y[0].push(y[0].front());
             ++dim[0];
             }

        if(M[x[0].front()-1][y[0].front()]==0){
            M[x[0].front()-1][y[0].front()]= M[x[0].front()][y[0].front()]+1;
            x[0].push(x[0].front()-1);
            y[0].push(y[0].front());
            ++dim[0];
            }

        if(M[x[0].front()][y[0].front()+1]==0)
            {M[x[0].front()][y[0].front()+1]= M[x[0].front()][y[0].front()]+1;
             x[0].push(x[0].front());
             y[0].push(y[0].front()+1);
             ++dim[0];
             }

        if(M[x[0].front()][y[0].front()-1]==0)
            {M[x[0].front()][y[0].front()-1]= M[x[0].front()][y[0].front()]+1;
             x[0].push(x[0].front());
             y[0].push(y[0].front()-1);
             ++dim[0];
             }

        x[0].pop();
        y[0].pop();
        --dim[0];
        }

    x[M[px][py]].push(px);
    y[M[px][py]].push(py);

    i = M[px][py];
    ++dim[i];
    while(i){
    while(dim[i]){

        if((M[x[i].front()+1][y[i].front()]>0)&&(viz[x[i].front()+1][y[i].front()]==0)){
            x[min(M[x[i].front()+1][y[i].front()],i)].push(x[i].front()+1);
            y[min(M[x[i].front()+1][y[i].front()],i)].push(y[i].front());
            ++dim[min(M[x[i].front()+1][y[i].front()],i)];
            viz[x[i].front()+1][y[i].front()] = min(M[x[i].front()+1][y[i].front()],i);
            }

        if((M[x[i].front()-1][y[i].front()]>0)&&(viz[x[i].front()-1][y[i].front()]==0)){
            x[min(M[x[i].front()-1][y[i].front()],i)].push(x[i].front()-1);
            y[min(M[x[i].front()-1][y[i].front()],i)].push(y[i].front());
            ++dim[min(M[x[i].front()-1][y[i].front()],i)];
            viz[x[i].front()-1][y[i].front()] = min(M[x[i].front()-1][y[i].front()],i);
            }

        if((M[x[i].front()][y[i].front()+1]>0)&&(viz[x[i].front()][y[i].front()+1]==0)){
            x[min(M[x[i].front()][y[i].front()+1],i)].push(x[i].front());
            y[min(M[x[i].front()][y[i].front()+1],i)].push(y[i].front()+1);
            ++dim[min(M[x[i].front()][y[i].front()+1],i)];
            viz[x[i].front()][y[i].front()+1] = min(M[x[i].front()][y[i].front()+1],i);
            }

        if((M[x[i].front()][y[i].front()-1]>0)&&(viz[x[i].front()][y[i].front()-1]==0)){
            x[min(M[x[i].front()][y[i].front()-1],i)].push(x[i].front());
            y[min(M[x[i].front()][y[i].front()-1],i)].push(y[i].front()-1);
            ++dim[min(M[x[i].front()][y[i].front()-1],i)];
            viz[x[i].front()][y[i].front()-1] = min(M[x[i].front()][y[i].front()-1],i);
            }

        x[i].pop();
        y[i].pop();
        --dim[i];
        }
        --i;
    }

    if(viz[ox][oy]>1) g << viz[ox][oy]-1;
    else g << -1;

    return 0;
}