Cod sursa(job #3368433)

Utilizator User-77-Stancu Andreas User-77- Data 14 octombrie 2026 15:13:49
Problema Barbar Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <fstream>
#define MAX 1001
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
struct pozitie{
    int i;
    int j;
};
int n,mm,i,j,istart,jstart,ifinal,jfinal,u,p,dr,st,mij,ok,okk;
char c;
int m[MAX][MAX];
int di[4]={ 1,-1, 0, 0};
int dj[4]={ 0, 0, 1,-1};
pozitie poz[MAX*MAX];
void traseu (int dist, int i, int j)
{
    if(i==ifinal && j==jfinal)
    {
        ok=1;
    }
    else if(ok==0)
    {
        for(int l=0;l<=3;l++)
        {
            if(m[i+di[l]][j+dj[l]]>=dist)
            {
                int x=m[i+di[l]][j+dj[l]];
                m[i+di[l]][j+dj[l]]=-1;
                traseu(dist,i+di[l],j+dj[l]);
                m[i+di[l]][j+dj[l]]=x;
            }
        }
    }
}
int main()
{
    cin>>n>>mm;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=mm;j++)
        {
            cin>>c;
            if(c=='*')
            {
                m[i][j]=-1;
            }
            if(c=='I')
            {
                istart=i;
                jstart=j;
            }
            if(c=='O')
            {
                ifinal=i;
                jfinal=j;
            }
            if(c=='D')
            {
                m[i][j]=-1;
                poz[++u].i=i;
                poz[u].j=j;
            }
        }
    }
    for(i=1;i<=n;i++)
    {
        m[i][0]=-1;
        m[i][n+1]=-1;
    }
    for(i=1;i<=mm;i++)
    {
        m[0][i]=-1;
        m[n+1][i]=-1;
    }
    while(p<u)
    {
        p++;
        i=poz[p].i;
        j=poz[p].j;
        int x=m[i][j];
        if(x==-1)
        {
            x=0;
        }
        for(int l=0;l<=3;l++)
        {
            if(m[i+di[l]][j+dj[l]]==0)
            {
                poz[++u].i=i+di[l];
                poz[u].j=j+dj[l];
                m[poz[u].i][poz[u].j]=x+1;
            }
        }
    }
    dr=m[istart][jstart];
    st=1;
    while(st<=dr)
    {
        mij=(dr+st)/2;
        ok=0;
        traseu(mij,istart,jstart);
        if(ok==1)
        {
            st=mij+1;
            ///cout<<".";
            okk=1;
        }
        else
        {
            dr=mij-1;
            ///cout<<",";
        }
    }
    mij=(st+dr)/2;
    if(okk==0)
    {
        mij=-1;
    }
    cout<<mij;
    return 0;
}