Cod sursa(job #2636074)

Utilizator xXoctavianXxStanescu Matei Octavian xXoctavianXx Data 16 iulie 2020 15:24:57
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <bits/stdc++.h>

using namespace std;

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

int lee[1002][1002];
short vizitat[1002][1002];
char c;
int n,m,si,sj,fi,fj;
queue<pair<int,int> > q;
queue<pair<int,int> > dragon;

int xi[4]={0,-1,0,1};
int xj[4]={1,0,-1,0};
int res=-1;

bool ok(int i, int j)
{
    if(1<=i && i<=n && 1<=j && j<=m && lee[i][j]!=-2)
        return true;
    else
        return false;
}

void dr(int i,int j)
{
    q.push({i,j});
    while(!q.empty())
    {
        int x=q.front().first;
        int y=q.front().second;
        q.pop();
        for(int p=0; p<4; p++)
        {
            int pi=x+xi[p];
            int pj=y+xj[p];
            if(ok(pi,pj) && (lee[pi][pj]>lee[x][y]+1 || lee[pi][pj]==-1))
            {
                lee[pi][pj]=lee[x][y]+1;
                q.push({pi,pj});
            }
        }
    }
}

bool verific(int val)
{
    while(!q.empty())
    {
        q.pop();
    }
    memset(vizitat,0,sizeof vizitat);
    vizitat[si][sj]=1;
    if(lee[si][sj]>=val) q.push({si,sj});
    else return false;

    while(!q.empty())
    {
        int x=q.front().first;
        int y=q.front().second;
        q.pop();
        for(int p=0; p<4; p++)
        {
            int pi=x+xi[p];
            int pj=y+xj[p];
            if(ok(pi,pj) && (vizitat[pi][pj]>vizitat[x][y]+1 || vizitat[pi][pj]==0) && lee[pi][pj]>=val)
            {
                if(pi==fi && pj==fj)
                {
                    return true;
                }
                vizitat[pi][pj]=vizitat[x][y]+1;
                q.push({pi,pj});
            }
        }
    }
    return false;
}

inline void cauta()
{
    int dr=n*m;
    int st=0;
    int mij=0;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(verific(mij))
        {
            res=mij;
            st=mij+1;
        }
        else dr=mij-1;
    }
}

int main()
{
    fin>>n>>m;
    for(int i=1; i<=n; ++i)
    {
        for(int j=1; j<=m; j++)
        {
            fin>>c;
            if(c=='.')  lee[i][j]=-1;
            else if(c=='*') lee[i][j]=-2;
            else if(c=='D')
            {
                lee[i][j]=0;
                dragon.push({i,j});
            }
            else if(c=='I')
            {
                si=i;
                sj=j;
                lee[i][j]=-1;
            }
            else if(c=='O')
            {
                fi=i;
                fj=j;
                lee[i][j]=-1;
            }
        }
    }

    while(!dragon.empty())
    {
        while(!q.empty()) q.pop();
        dr(dragon.front().first, dragon.front().second);
        dragon.pop();
    }
    cauta();
    fout<<res;
    return 0;
}