Cod sursa(job #2817912)

Utilizator db_123Balaban David db_123 Data 14 decembrie 2021 17:41:07
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <fstream>
#include <bitset>
#include <queue>

using namespace std;

ifstream cin("barbar.in");
ofstream cout("barbar.out");

const int DIM=1005;

int n,m,punctPlecareI=0,punctPlecareJ=0;
char ma[DIM][DIM]={0};
bitset<1> visited[DIM][DIM]={0};
queue<pair<int,int>> q;
int distDragon[DIM][DIM]={0};

void leeDistanteDragon(){
    int dirI[4]={1,-1,0,0};
    int dirJ[4]={0,0,1,-1};

    int i1=0,j1=0;
    while(!q.empty()){
        i1=q.front().first;
        j1=q.front().second;
        q.pop();

        int i=0,j=0;
        for(int u=0;u<4;u++){
            i=i1+dirI[u];
            j=j1+dirJ[u];
            if((i>0 && i<=n) && (j>0 && j<=m) && visited[i][j]==0 and ma[i][j]!='*'){
                //cout << "neighbor push  " << i << " " << j << "\n";
                q.push({i,j});
                visited[i][j] =1;
                distDragon[i][j]=distDragon[i1][j1]+1;
            }
        }
    }
}

bool isDistanceValid(int dist){
    int dirI[4]={1,-1,0,0};
    int dirJ[4]={0,0,1,-1};

    while(!q.empty()){
        q.pop();
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            visited[i][j]=0;
        }
    }

    q.push({punctPlecareI,punctPlecareJ});
    visited[punctPlecareI][punctPlecareJ]=1;

    int i=0,j=0;
    while(!q.empty()){
        i=q.front().first;
        j=q.front().second;
        //cout<<"am dat pop I:"<<i<<" j:"<<j<<" distanta:"<<dist<<'\n';
        q.pop();

        if(ma[i][j]=='O'){
            return true;
        }

        int i1=0,j1=0;
        for(int u=0;u<4;u++){
            i1=i+dirI[u];
            j1=j+dirJ[u];
            if((i1>0 && i1<=n) && (j1>0 && j1<=m) && visited[i1][j1]==0 && distDragon[i1][j1]>=dist && ma[i1][j1]!='D' && ma[i1][j1]!='*'){
                //cout<<"i:"<<i1<<" j:"<<j1<<'\n';
                visited[i1][j1]=1;
                q.push({i1,j1});
            }
        }
    }
    return false;
}

int main() {

    cin>>n>>m;

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>ma[i][j];
            if(ma[i][j]=='D'){
                //cout << "start push " << i << " " << j << "\n";
                q.push({i,j});
                visited[i][j]=1;
            }
            if(ma[i][j]=='I'){
                punctPlecareI=i;
                punctPlecareJ=j;
            }
        }
    }

    leeDistanteDragon();



    int l=1,r=n*m,mid=0,ans=-1;
    while(l<=r){
        mid=l+(r-l)/2;
        if(isDistanceValid(mid)==true){
            ans=max(mid,ans);
            l=mid+1;
        }
        else{
            r=mid-1;
        }
    }

    cout<<ans;

    /*for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cout<<distDragon[i][j]<<" ";
        }
        cout<<'\n';
    }*/
    return 0;
}