Cod sursa(job #2760365)

Utilizator tryharderulbrebenel mihnea stefan tryharderul Data 25 iunie 2021 17:17:59
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1003;

int n,m,a,b,ox,oy;
int v[NMAX][NMAX];
int viz[NMAX][NMAX];

int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};

queue<pair<int,int> >q;

bool inside(int x,int y){
    return x>=1 && y>=1 && x<=n && y<=m;
}

bool ok(int val){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)viz[i][j]=0;
    }
    queue<pair<int,int> >q;
    q.push({a,b});
    while(!q.empty()){
        int x=q.front().first;
        int y=q.front().second;
        q.pop();
        for(int i=0;i<4;i++){
            int newx=x+dx[i];
            int newy=y+dy[i];
            if(inside(newx,newy)){
                if(v[newx][newy] > -1 && v[newx][newy]>=val && !viz[newx][newy] ){
                    q.push({newx,newy});
                    viz[newx][newy]=1;
                }
            }
        }
    }
    if(viz[ox][oy])return 1;
    return 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++){
            v[i][j]=INT_MAX;
            char c;
            cin>>c;
            if(c=='D'){
                v[i][j]=0;
                q.push({i,j});
            }else if(c=='I'){
                a=i;
                b=j;
            }else if(c=='*'){
                v[i][j]=-1;
            }else if(c=='O'){
                ox=i;
                oy=j;
            }
        }
    }
    while(!q.empty()){
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        for(int i=0;i<4;i++){
            int newx=x+dx[i];
            int newy=y+dy[i];
            if(inside(newx,newy)){
                if(v[newx][newy]>-1 && v[x][y]+1<v[newx][newy] ){
                    v[newx][newy]=v[x][y]+1;
                    q.push({newx,newy});
                }

            }
        }

    }
    int st=0,dr=2000,last=-1;
    while(dr-st>=0){
        int mid=(st+dr)>>1;
        if(ok(mid) ){
            last=mid;
            st=mid+1;
        }else{
            dr=mid-1;
        }
    }
    printf("%d\n",last);



    return 0;
}