Cod sursa(job #2929719)

Utilizator Bogdan345Marius Mihalache Bogdan345 Data 26 octombrie 2022 18:05:25
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
queue<pair<int,int>>q;
vector<vector<bool>>obstacol;
vector<vector<int>>distanta;
vector<int>dirX={1,-1,0,0};
vector<int>dirY={0,0,1,-1};
vector<vector<int>>folosit;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
const int inf=1e9;
int main(){
    int n,m;
    cin>>n>>m;
    obstacol.resize(n+1,vector<bool>(m+1,false));
    distanta.resize(n+1,vector<int>(m+1,inf));
    folosit.resize(n+1,vector<int>(m+1));
    char c;
    pair<int,int>inceput,sfarsit;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>c;
            if(c=='*'){
                obstacol[i][j]=true;
            }
            if(c=='D'){
                    distanta[i][j]=0;
                    q.push({i,j});
            }
            if(c=='I'){
                inceput={i,j};

            }
             if(c=='O'){
                sfarsit={i,j};
            }
        }
    }

    while (!q.empty()) {//fac din fiecare dragon distanta minima pana la fiecare pozitie din matrice
        pair < int, int > now = q.front();
        q.pop();
        for (int i = 0; i < 4; i++) {
            int x = now.first + dirX[i];
            int y = now.second + dirY[i];

            if (x < 1 || x > n || y < 1 || y > m) {
                continue;
            }
            if (obstacol[x][y]) {
                continue;
            }
            if (distanta[x][y] != inf) {
                continue;
            }
            distanta[x][y] = distanta[now.first][now.second] + 1;
            q.push({ x , y });
        }
    }
    int ans=-1;
    int stanga=1,dreapta=distanta[inceput.first][inceput.second];
    while(stanga<=dreapta){
        int mij=stanga+dreapta;
        mij/=2;
        q.push(inceput);
        folosit[inceput.first][inceput.second]=1;
        while(!q.empty()){
        pair<int,int>pozInt=q.front();
          q.pop();
            for(int i=0;i<=3;i++){
               int x=pozInt.first+dirX[i];
               int y=pozInt.second+dirY[i];
               if(x<1 || x>n || y<1 || y>m){
                continue;
               }
               if(distanta[x][y]<mij){
                continue;
               }
               if(obstacol[x][y]){
                continue;
               }
               if(folosit[x][y]){
                continue;
               }
               folosit[x][y]=1;
               q.push({x,y});
            }
        }
      if(folosit[sfarsit.first][sfarsit.second]){
          ans=mij;
          stanga=mij+1;
      }else{
          dreapta=mij-1;
      }
      for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            folosit[i][j]=0;
        }
      }

    }
    cout<<ans;
}