Cod sursa(job #3316558)

Utilizator anca.gdDumitru Anca Gabriela anca.gd Data 19 octombrie 2025 11:09:34
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 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;
    for(int i=1; i<=n;i++)
        for(int j=1; j<=m;j++)
            dd[i][j]=1e9;
    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]=0;
            }
            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[x][y]+1<dd[xv][yv]){
                dd[xv][yv]=dd[x][y]+1;
                q.push({xv,yv});
            }
        }
    }
    int st=dd[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]=1e9;
        d[is][js]=0;
        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[x][y]+1<d[xv][yv]){
                    d[xv][yv]=d[x][y]+1;
                    q.push({xv,yv});
                }
            }
        }
        if(d[ie][je]==1e9)
            dr=mij-1;
        else st=mij+1;
    }
    fout<<st-1;
    return 0;
}