Cod sursa(job #3327506)

Utilizator LucaMirsolea14Luca Mirsolea LucaMirsolea14 Data 4 decembrie 2025 11:16:33
Problema Barbar Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <fstream>
#define N 1002
using namespace std;

struct aa
{
    int l,c;
} q[N*N];

int n,m,d[N][N],d1[N][N],li,ci,lf,cf;
short int a[N][N];
int dx[]= {0, 1, 0, -1}, dy[]= {1, 0, -1, 0}; /// directii
char ch;

bool interior(int l, int c)
{
    return l>=1 && l<=n && c>=1 && c<=m;
}

bool bfs(int dst)
{
    int p=1,u=0;
    if(d[li][ci] < dst)
        return 0;

    q[++u] = {li,ci};
    d1[li][ci] = 1;

    while(p<=u)
    {
        int l=q[p].l;
        int c=q[p].c;

        if(l==lf&&c==cf)
            return 1;

        for(int k=0; k<4; k++)
        {
            int lv=l+dx[k];
            int cv=c+dy[k];
            if(interior(lv,cv)&&a[lv][cv]==0&&d1[lv][cv]==0)
            {
                if(d[lv][cv]>=dst)
                {
                    d1[lv][cv] = d1[l][c]+1;
                    q[++u] = {lv,cv};
                }
            }
        }
        p++;
    }
    return 0;
}

int main()
{
    ifstream cin("barbar.in");
    ofstream cout("barbar.out");
    cin>>n>>m;
    int p=1,u=0;
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j)
        {
            cin>>ch;
            switch(ch)
            {
            case '.':
                a[i][j] = 0;
                break;  /// liber
            case '*':
                a[i][j] =-1;
                break;  /// intrare
            case 'I':
                a[i][j] = 0;
                li=i;
                ci=j;
                break; /// iesire
            case 'O':
                a[i][j] = 0;
                lf=i;
                cf=j;
                break;  /// dragon
            case 'D':
                a[i][j] = 0;
                q[++u]= {i,j};
                d[i][j]=1;

                break;
            }
        }

    while(p<=u)
    {
        int l=q[p].l;
        int c=q[p].c;
        for(int dir=0; dir<4; ++dir)
        {
            int lv=l+dx[dir];
            int cv=c+dy[dir];
            if(interior(lv,cv))
                if(d[lv][cv]==0&&a[lv][cv]==0)
                {
                    q[++u]= {lv,cv};
                    d[lv][cv]=d[l][c]+1;
                }
        }
        p++;
    }

    int st=0, dr=n*m, ans=-1;
    while(st<=dr)
    {
        int mij = (st+dr)/2;
        if(bfs(mij))
        {
            ans=mij;
            st=mij+1;
        }
        else dr=mij-1;
    }

    if(ans==-1)
        cout<<-1;
    else
        cout<<ans;
    return 0;
}