Cod sursa(job #2424592)

Utilizator PopescuAndreiAlexandruPopescu Andrei Alexandru PopescuAndreiAlexandru Data 23 mai 2019 12:51:59
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.24 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>

using namespace std;

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

#define nmax 1005

int n,m,v[nmax][nmax],d[nmax][nmax],c=0,stx,sty,stpx,stpy,drum[nmax][nmax],viz[nmax][nmax];

char a;

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

queue < pair<int,int> > coada;

int OK(int i, int j)
{
    if(i<1 || j<1 || i>n || j>m)
        return false;
    if(v[i][j]==-1)
        return false;
    return true;
}

struct Compare
{
    bool operator()(pair<int,int> x, pair<int,int> y)
    {
        return d[x.first][x.second]<d[y.first][y.second];
    }
};

priority_queue < pair<int,int>, vector< pair<int,int> >, Compare> Heap;

void Fill()
{
    int i,j,i_urm,j_urm;
    while(!coada.empty())
    {
        i=coada.front().first;
        j=coada.front().second;
        coada.pop();
        for(int dir=0;dir<4;dir++)
        {
            i_urm=i+dl[dir];
            j_urm=j+dc[dir];
            if(OK(i_urm,j_urm) && !d[i_urm][j_urm])
            {
                d[i_urm][j_urm]=d[i][j]+1;
                coada.push(make_pair(i_urm,j_urm));
            }
            else
            {
                if(OK(i_urm,j_urm) && d[i_urm][j_urm])
                {
                    if(d[i][j]+1<d[i_urm][j_urm])
                        d[i_urm][j_urm]=d[i][j]+1;
                }
            }
        }
    }
}

void Lee()
{
    int i,j,i_urm,j_urm;
    Heap.push(make_pair(stx,sty));
    viz[stx][sty]=1;
    while(!Heap.empty())
    {
        i=Heap.top().first;
        j=Heap.top().second;
        Heap.pop();
        for(int dir=0;dir<4;dir++)
        {
            i_urm=i+dl[dir];
            j_urm=j+dc[dir];
            if(OK(i_urm,j_urm) && !v[i_urm][j_urm])
            {
                v[i_urm][j_urm]=v[i][j]+1;
                viz[i_urm][j_urm]=1;
                if(d[i_urm][j_urm]<drum[i][j])
                    drum[i_urm][j_urm]=d[i_urm][j_urm];
                else
                    drum[i_urm][j_urm]=drum[i][j];
                Heap.push(make_pair(i_urm,j_urm));
            }
        }
    }
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            fin>>a;
            switch(a)
            {
            case '*':
                {
                    v[i][j]=-1;
                    d[i][j]=-1;
                    break;
                }
            case 'I':
                {
                    v[i][j]=1;
                    stx=i;
                    sty=j;
                    break;
                }
            case 'O':
                {
                    stpx=i;
                    stpy=j;
                    break;
                }
            case 'D':
                {
                    coada.push(make_pair(i,j));
                    d[i][j]=1;
                    break;
                }
            default:
                {
                    break;
                }
            }
        }
    }
    Fill();
    drum[stx][sty]=d[stx][sty];
    Lee();
    if(viz[stpx][stpy])
        fout<<drum[stpx][stpy]-1;
    else
        fout<<-1;
}