Cod sursa(job #3365985)

Utilizator Andreea3425Diaconu Andreea Andreea3425 Data 28 septembrie 2026 11:40:37
Problema Barbar Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <bits/stdc++.h>

using namespace std;

#define N 1000

char v[N+1][N+1];
int d[N+1][N+1], f[N+1][N+1];

int dl[4]={-1, 0, 0, 1};
int dc[4]={0, -1, 1, 0};

bool ok(int mij, int n, int m, int l1, int c1, int l2, int c2){
    int l,c,i,lin,col;

    memset(f, 0, sizeof(f));

    queue <pair <int, int> > q;
    q.push(make_pair(l1, c1));

    if (d[l1][c1]<mij)
        return 0;

    while (!q.empty()){
        l=q.front().first;
        c=q.front().second;
        q.pop();

        if (l==l2 && c==c2)
            return 1;

        for (i=0; i<4; i++){
            lin=l+dl[i];
            col=c+dc[i];
            if (lin>0 && lin<=n && col>0 && col<=m && d[lin][col]>=mij && v[lin][col]!='*' && f[lin][col]==0){
                f[lin][col]=1;
                q.push(make_pair(lin, col));
            }
        }
    }

    return 0;
}

int main()
{
    ifstream cin ("barbar.in");
    ofstream cout ("barbar.out");

    int n,m,i,j,l1,l2,c1,c2,l,c,lin,col,st,dr,mij;

    cin >> n >> m;

    for (i=1; i<=n; i++)
        cin.getline(v[i]+1, N);

    queue <pair <int, int> > q;

    l1=l2=c1=c2=0;
    for (i=1; i<=n; i++)
        for (j=1; j<=m; j++){
            if (v[i][j]=='D'){
                q.push(make_pair(i, j));
                d[i][j]=1;
            }

            if (v[i][j]=='I'){
                l1=i;
                c1=j;
            }

            if (v[i][j]=='O'){
                l2=i;
                c2=j;
            }
        }

    while (!q.empty()){
        l=q.front().first;
        c=q.front().second;
        q.pop();

        for (i=0; i<4; i++){
            lin=l+dl[i];
            col=c+dc[i];
            if (lin>0 && lin<=n && col>0 && col<=m && d[lin][col]==0 && v[lin][col]!='*'){
                d[lin][col]=d[l][c]+1;
                q.push(make_pair(lin, col));
            }
        }
    }

    st=0;
    dr=n+m;
    while (st<=dr){
        mij=(st+dr)/2;
        if (ok(mij, n, m, l1, c1, l2, c2)==1)
            st=mij+1;
        else
            dr=mij-1;
    }

    cout << st-2 << '\n';

    return 0;
}