Cod sursa(job #2345649)

Utilizator DovlecelBostan Andrei Dovlecel Data 16 februarie 2019 16:00:06
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.62 kb
#include <fstream>

using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int N=1001;
int v[N][N],r,c,sol;
pair<int,int> coada[N*N],coada2[N*N],start,fin;
int di[4]={1,0,-1,0};
int dj[4]={0,1,0,-1};
bool viz[N][N];

bool ok(int x, int y)
{
    return(x>0 && y>0 && x<=r && y<=c);
}

int main()
{
    char ch;
    int st=1,dr=0;
    in>>r>>c;
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
        {
            in>>ch;
            if(ch=='*')
                v[i][j]=-1;
            else if(ch=='D')
            {
                coada[++dr]=make_pair(i,j);
                v[i][j]=-1;
            }
            else if(ch=='I')
            {
                start.first=i;
                start.second=j;
            }
            else if(ch=='O')
            {
                fin.first=i;
                fin.second=j;
            }
        }
    pair<int,int>p;
    while(st<=dr)
    {
        p=coada[st];
        for(int i=0;i<4;i++)
            if(ok(p.first+di[i],p.second+dj[i]) && v[p.first+di[i]][p.second+dj[i]]==0)
            {
                v[p.first+di[i]][p.second+dj[i]]=1+v[p.first][p.second];
                coada[++dr]=make_pair(p.first+di[i],p.second+dj[i]);
            }
        st++;
    }
    /*for(int i=1;i<=r;i++)
    {
        for(int j=1;j<=c;j++)
            out<<v[i][j]<<' ';
        out<<'\n';
    }*/
    st=1;dr=0;
    int st2=1,dr2=0;
    coada[++dr]=start;
    int best=v[start.first][start.second],x,y;
    bool gasit=false;
    while(best>=0 && !gasit)
    {
        for(int i=st2;i<=dr2;i++)
            coada[++dr]=coada2[i];
        while(st<=dr)
        {
            p=coada[st];
            if(p==fin)
            {
                gasit=true;
                sol=best+1;
                break;
            }
            for(int i=0;i<4;i++)
            {
                x=p.first+di[i];
                y=p.second+dj[i];
                if(!viz[x][y] && ok(x,y))
                {
                    if(v[x][y]>=best)
                    {
                        coada[++dr]=make_pair(x,y);
                        viz[x][y]=true;
                    }
                    else if(v[p.first+di[i]][p.second+dj[i]]==best-1)
                    {
                        coada2[++dr2]=make_pair(p.first+di[i],p.second+dj[i]);
                        viz[p.first+di[i]][p.second+dj[i]]=true;
                    }
                }
            }
            st++;
        }
        best--;
    }
    if(sol==0)
    {
        out<<-1;
        return 0;
    }
    out<<sol;
    return 0;
}