Cod sursa(job #3205993)

Utilizator Bogdan345Marius Mihalache Bogdan345 Data 21 februarie 2024 12:18:05
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
const int MAXN=1e3;
const int inf=1e6+1;
queue<pair<int,int>>q;
char mat[MAXN+1][MAXN+1];
int distanta_dragon[MAXN+1][MAXN+1];
bool folosit[MAXN+1][MAXN+1];
int x[4]={1,-1,0,0};
int y[4]={0,0,-1,1};
int main(){
    int n,m;
    cin>>n>>m;
    pair<int,int>Barbar,Iesire;
    string s;
    for(int i=0;i<=n;i++){
        getline(cin,s);
        for(int j=0;j<s.size();j++){
            mat[i][j+1]=s[j];
            distanta_dragon[i][j+1]=inf;
            if(s[j]=='D'){
                distanta_dragon[i][j+1]=0;
                q.push({i,j+1});
            }else if(s[j]=='I'){
                Barbar.first=i;
                Barbar.second=j+1;
            }else if(s[j]=='O'){
                Iesire.first=i;
                Iesire.second=j+1;
            }
        }
    }
    while(!q.empty()){
        pair<int,int>poz=q.front();
        q.pop();
        for(int i=0;i<=3;i++){
            int X=x[i]+poz.first;
            int Y=y[i]+poz.second;
            if(X<1 || X>n || Y<1 || Y>m || mat[X][Y]=='*' || mat[X][Y]=='D' || distanta_dragon[X][Y]!=inf){
                continue;
            }
           
            distanta_dragon[X][Y]=distanta_dragon[poz.first][poz.second]+1;
            q.push({X,Y});
            
        }
    }
int st=1;
int dr=distanta_dragon[Iesire.first][Iesire.second];
int rasp=-1;
while(st<=dr){
    int mij=(st+dr)/2;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            folosit[i][j]=1;
        }
    }
    folosit[Barbar.first][Barbar.second]=0;
    q.push({Barbar.first,Barbar.second});
    while(!q.empty()){
        pair<int,int>poz=q.front();
        q.pop();
        for(int i=0;i<=3;i++){
            int X=x[i]+poz.first;
            int Y=y[i]+poz.second;
            if(X<1 || X>n || Y<1 || Y>m || mat[X][Y]=='*' || mat[X][Y]=='D' || distanta_dragon[X][Y]<mij || !folosit[X][Y]){
                continue;
            }
            folosit[X][Y]=0;
            if(X==Iesire.first && Y==Iesire.second){
                break;
            }
            q.push({X,Y});
        }
        if(!folosit[Iesire.first][Iesire.second]){
            while(!q.empty()){
                q.pop();
            }
        }
    }
    if(folosit[Iesire.first][Iesire.second]){
        dr=mij-1;
    }else{
        rasp=max(rasp,mij);
        st=mij+1;
    }
}
cout<<rasp;
}