Cod sursa(job #3316561)

Utilizator anca.gdDumitru Anca Gabriela anca.gd Data 19 octombrie 2025 11:18:37
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int di[]={0,0,1,-1};
const int dj[]={1,-1,0,0};
int n, m, mat[1005][1005], d[1005][1005], dd[1005][1005];
int is,js,ie,je;
queue<pair<int,int>> q;
int main()
{
    fin>>n>>m;
    char x;
    for(int i=1; i<=n;i++)
        for(int j=1; j<=m; j++){
            fin>>x;
            if(x=='D'){
                q.push({i,j});
                dd[i][j]=1;
                mat[i][j]=1;
            }
            if(x=='I'){
                is=i; js=j;
            }
            if(x=='O'){
                ie=i; je=j;
            }
            if(x=='*')
                mat[i][j]=1;
        }
    while(!q.empty()){
        int x=q.front().first, y=q.front().second;
        q.pop();
        for(int k=0;k<4; k++){
            int xv=x+di[k], yv=y+dj[k];
            if(1<=xv && xv<=n && 1<=yv && yv<=m && !mat[xv][yv] && !dd[xv][yv]){
                dd[xv][yv]=dd[x][y]+1;
                q.push({xv,yv});
            }
        }
    }
    bool yep=0;
    int st=d[is][js], dr=n+m;
    while(st<=dr){
        int mij=(st+dr)/2;
        q.push({is,js});
        for(int i=1; i<=n;i++)
            for(int j=1; j<=m;j++)
                d[i][j]=0;
        d[is][js]=1;
        while(!q.empty()){
            int x=q.front().first, y=q.front().second;
            q.pop();
            for(int k=0;k<4; k++){
                int xv=x+di[k], yv=y+dj[k];
                if(1<=xv && xv<=n && 1<=yv && yv<=m && dd[xv][yv]>=mij &&!mat[xv][yv] && !d[xv][yv]){
                    d[xv][yv]=d[x][y]+1;
                    q.push({xv,yv});
                }
            }
        }
        if(!d[ie][je])
            dr=mij-1;
        else { st=mij+1; yep=1;}
    }
    if(!yep) fout<<-1<<'\n';
    else fout<<st-2;
    return 0;
}