Cod sursa(job #2417274)

Utilizator mihneacazCazacu Mihnea mihneacaz Data 29 aprilie 2019 13:36:34
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <cstdio>
#include <queue>

const int NMAX=1005;

using namespace std;

char a[NMAX][NMAX];
int cnt[NMAX][NMAX];
int viz[NMAX][NMAX];
int di[]={0,-1,0,1};
int dj[]={-1,0,1,0};
int l,c;

bool check(int x)
{
    for(int i=0; i<l; ++i)
        for(int j=0; j<c; ++j)
            viz[i][j]=0;
    queue <pair<int,int>> q;
    for(int i=0; i<l; ++i)
    {
        for(int j=0; j<c; ++j)
            if(a[i][j]=='I'){
                q.push({i,j});
                break;
            }
        if(!q.empty())
            break;
    }
    if(cnt[q.front().first][q.front().second]<x)
        return 0;
    while(!q.empty())
    {
        pair <int,int> curr;
        curr=q.front();
        q.pop();
        for(int i=0; i<4; ++i)
        {
            pair <int,int> newcurr;
            newcurr.first=curr.first+di[i];
            newcurr.second=curr.second+dj[i];
            if((newcurr.first>=0 && newcurr.first<l) &&(newcurr.second>=0 && newcurr.second<c) && (a[newcurr.first][newcurr.second]=='.' || a[newcurr.first][newcurr.second]=='O' || a[newcurr.first][newcurr.second]=='D') && viz[newcurr.first][newcurr.second]==0 && cnt[newcurr.first][newcurr.second]>=x){
                viz[newcurr.first][newcurr.second]=viz[curr.first][curr.second]+1;
                q.push(newcurr);
                if(a[curr.first][curr.second]=='O')
                    return 1;
            }
        }
    }
    return 0;
}
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d",&l,&c);
    for(int i=0; i<l; ++i){
        scanf("%s",a[i]);
    }
    queue <pair<int,int>> q;
    for(int i=0; i<l; ++i)
        for(int j=0; j<c; ++j)
            if(a[i][j]=='D')
                q.push({i,j});
    while(!q.empty())
    {
        pair <int,int> curr;
        curr=q.front();
        q.pop();
        for(int i=0; i<4; ++i)
        {
            pair <int,int> newcurr;
            newcurr.first=curr.first+di[i];
            newcurr.second=curr.second+dj[i];
            if((newcurr.first>=0 && newcurr.first<l) &&(newcurr.second>=0 && newcurr.second<c) && (a[newcurr.first][newcurr.second]=='.' || a[newcurr.first][newcurr.second]=='O' || a[newcurr.first][newcurr.second]=='I') && cnt[newcurr.first][newcurr.second]==0){
                cnt[newcurr.first][newcurr.second]=cnt[curr.first][curr.second]+1;
                q.push(newcurr);
            }
        }
    }
    int st=0;
    int dr=l*c;
    int best=1e9;
    while(st<=dr)
    {
        int mij=(st+dr)>>1;
        if(check(mij))
        {
            best=mij;
            st=mij+1;
        }
        else
            dr=mij-1;

    }
    if(best==1e9)
        printf("-1\n");
    else
        printf("%d\n",best);
    return 0;
}