Cod sursa(job #2891659)

Utilizator Ana100Ana-Maria Tomoiala Ana100 Data 19 aprilie 2022 14:25:31
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
queue<pair<int,int>>q;
int d[1005][1005],dist[1005][1005];
char v[1005][1005];
int n,m,starti,startj,finishi,finishj;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
bool inside(int i, int j)
{
    if(i>=1 and i<=n and j>=1 and j<=m and v[i][j]!='*' and v[i][j]!='D' and v[i][j]!='I')
       return true;
    return false;
}
void lee()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(v[i][j]=='.' or v[i][j]=='O')
               d[i][j]=(1<<30);
        }
    }
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(v[i][j]=='D')
            q.push({i,j});
        }
    }
    while(q.size()>0)
    {
        int curenti=q.front().first;
        int curentj=q.front().second;
        q.pop();
        for(int w=0;w<4;w++)
        {
            int vecini=curenti+dx[w];
            int vecinj=curentj+dy[w];
            if(inside(vecini,vecinj)==true and d[vecini][vecinj]>d[curenti][curentj]+1)
            {
                d[vecini][vecinj]=d[curenti][curentj]+1;
                q.push({vecini,vecinj});
            }
        }
    }
}
bool check(int x)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            dist[i][j]=(1<<30);
        }
    }
    q.push({starti,startj});
    dist[starti][startj]=0;
    while(q.size()>0)
    {
        int curenti=q.front().first;
        int curentj=q.front().second;
        q.pop();
        for(int w=0;w<4;w++)
        {
            int vecini=curenti+dx[w];
            int vecinj=curentj+dy[w];
            if(inside(vecini,vecinj)==true and dist[vecini][vecinj]>dist[curenti][curentj]+1 and d[vecini][vecinj]>=x)
            {
                dist[vecini][vecinj]=d[curenti][curentj]+1;
                q.push({vecini,vecinj});
            }
        }
    }
   // cout<<finishi<<" "<<finishj<<endl;
    if(dist[finishi][finishj]!=(1<<30))
    {
        return true;
    }
    return false;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>v[i][j];
            if(v[i][j]=='I')
            {
                starti=i;
                startj=j;
            }
            else if(v[i][j]=='O')
            {
                finishi=i;
                finishj=j;
            }
        }
    }
    lee();
    int ans=-1;
    int st=1;
    int dr=n+m;
    while(st<=dr)
    {
        int mij=(st+dr)>>1;
        //cout<<ans<<endl;
        if(check(mij)==true and mij>ans)
        {
            ans=mij;
            st=mij+1;
        }
        else
        {
            dr=mij-1;
        }
    }
    if(ans!=-1)
      cout<<ans;
    else
      cout<<-1;
    return 0;
}