Cod sursa(job #3368486)

Utilizator User-77-Stancu Andreas User-77- Data 14 octombrie 2026 20:27:09
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <fstream>
#define MAX 1002
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,minim;
char c;
int m[MAX][MAX],best[MAX][MAX];
int di[4]={ 1,-1, 0, 0};
int dj[4]={ 0, 0, 1,-1};
pozitie poz[MAX*MAX];
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;
            }
        }
    }
    int nrd=u;
    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;
            }
        }
    }
    for(i=1;i<=nrd;i++)
    {
        m[poz[i].i][poz[i].j]=0;
    }
    poz[1].i=istart;
    poz[1].j=jstart;
    p=0;
    u=1;
    best[istart][jstart]=m[istart][jstart];
    while(p<u)
    {
        p++;
        i=poz[p].i;
        j=poz[p].j;
        for(int l=0;l<=3;l++)
        {
            if(m[i+di[l]][j+dj[l]]>0)
            {
                minim=min(best[i][j],m[i+di[l]][j+dj[l]]);
                if(minim>best[i+di[l]][j+dj[l]])
                {
                    poz[++u].i=i+di[l];
                    poz[u].j=j+dj[l];
                    best[poz[u].i][poz[u].j]=minim;
                }
            }
        }
    }
    if(best[ifinal][jfinal]==0)
    {
        best[ifinal][jfinal]=-1;
    }
    cout<<best[ifinal][jfinal];
    return 0;
}