Cod sursa(job #2667797)

Utilizator metallidethantralayerIon Cojocaru metallidethantralayer Data 3 noiembrie 2020 21:03:42
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <bits/stdc++.h>

using namespace std;

int a[1005][1005],n,m,i_s,j_s,i_f,j_f;
const short int dx[]= {-1,0,1,0};
const short int dy[]= {0,1,0,-1};
queue <pair<int,int> > Q;
bitset <1005>Zid[1005];
set <pair <int,int> > S;
bool ok=true;
bool Verif(int x)
{
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            a[i][j]=0;
    if(x)
    {
        for(set<pair<int,int> >::iterator i=S.begin(); i!=S.end(); i++)
            Q.push(make_pair(i->first,i->second)),a[i->first][i->second]=1;
        while(!Q.empty())
        {
            int i=Q.front().first;
            int j=Q.front().second;
            Q.pop();
            for(int d=0; d<=3; d++)
            {
                int iv=i+dx[d];
                int jv=j+dy[d];
                if(iv>=1&&jv>=1&&iv<=n&&jv<=m&&!a[iv][jv])
                {
                    if(a[i][j]<x)
                    {
                        Q.push(make_pair(iv,jv));
                        a[iv][jv]=a[i][j]+1;
                    }
                }
            }
            a[i][j]=-1;
        }
        if(a[i_s][j_s]==-1)
            return false;
    }
    a[i_s][j_s]=1;
    Q.push(make_pair(i_s,j_s));
    while(!Q.empty())
    {
        int i=Q.front().first;
        int j=Q.front().second;
        Q.pop();
        for(int d=0; d<=3; d++)
        {
            int iv=i+dx[d];
            int jv=j+dy[d];
            if(iv>=1&&jv>=1&&iv<=n&&jv<=m&&!a[iv][jv]&&!Zid[iv][jv])
            {
                Q.push(make_pair(iv,jv));
                a[iv][jv]=a[i][j]+1;
            }
        }
    }
    if(a[i_f][j_f]>0)
        ok=false;
    return (a[i_f][j_f]>0);
}
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            char x;
            cin>>x;
            if(x=='I')
                i_s=i,j_s=j;
            else if(x=='O')
                i_f=i,j_f=j;
            else if(x=='*')
                Zid[i][j]=true;
            else if(x=='D')
                S.insert(make_pair(i,j));
        }
    int st=0,dr=1e3,ans=-1;
    while(st<=dr)
    {
        int mi=(st+dr)>>1;
        if(Verif(mi))
            ans=mi,st=mi+1;
        else
            dr=mi-1;
    }
    if(!ok)
        ans=max(ans,0);
    printf("%d",ans);
    return 0;
}