Cod sursa(job #3332508)

Utilizator Grama2008Grama Andrei Teodor Grama2008 Data 7 ianuarie 2026 00:21:03
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <bits/stdc++.h>

using namespace std;

int v[1005][1005], starti, startj,endi,endj,n,m,d[1005][1005];
bool vis[1005][1005];
vector<pair<int,int>>dragoni;
int di[4]={1,-1,0,0};
int dj[4]={0,0,1,-1};

bool check(int i, int j) {
    return 1<=i && i<=n && 1<=j && j<=m && v[i][j]==0;
}

bool b(int val) {
    queue<pair<int,int>>q;
    memset(vis, 0, sizeof(vis));
    q.push({starti,startj});
    vis[starti][startj]=true;
    if (d[starti][startj]<val) {
        return false;
    }
    while (!q.empty()) {
        auto [x,y]=q.front();q.pop();
        for (int k=0;k<4;k++) {
            int i=x+di[k], j=y+dj[k];
            if (check(i,j) && !vis[i][j] && d[i][j]>=val){
                vis[i][j]=true;
                q.push({i,j});
            }
        }
    }
    return vis[endi][endj];
}

signed main()
{
    memset(d, (1<<6)-1, sizeof(d));
    freopen("barbar.in", "r", stdin);
    freopen("barbar.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin>>n>>m;
    queue<pair<int,int>>q;
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            char c;cin>>c;
            if (c=='I') {
                starti=i;
                startj=j;
            }
            if (c=='O') {
                endi=i;
                endj=j;
            }
            if (c=='D') {
                q.push({i,j});
                d[i][j]=0;
                v[i][j]=1;
            }
            if (c=='*') {
                v[i][j]=1;
            }
        }
    }
    while (!q.empty()) {
        auto [x,y]=q.front();q.pop();
        for (int k=0;k<4;k++) {
            int i=x+di[k], j=y+dj[k];
            if (check(i,j) && d[i][j]>d[x][y]+1) {
                d[i][j]=d[x][y]+1;
                q.push({i,j});
            }
        }
    }
    int left=1, right=1e6, ans=-1;
    while (left<=right) {
        int mid=(left+right)/2;
        if (b(mid)) {
            ans=mid;
            left=mid+1;
        }
        else {
            right=mid-1;
        }
    }
    cout<<ans;
    return 0;
}