Cod sursa(job #2919678)

Utilizator dobreraduDobre Radu Fabian dobreradu Data 18 august 2022 17:03:31
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.98 kb
#include <fstream>

using namespace std;
ifstream cin ("barbar.in");
ofstream cout ("barbar.out");
int dragoni[1010][1010],viz[1010][1010],dirL[4]={-1,0,1,0},dirC[4]={0,1,0,-1};
struct ura
{
    int l,c;
};
ura coada[1000010];
int main()
{
    int n,m,i,j,ctd,inc,sf,lin,col,minn,l_start,c_start,l_finish,c_finish,pp,st,dr,mijl,ans;
    char ch;
    cin>>n>>m;
    ctd=0;
    for (i=1; i<=n; i++)
        for (j=1; j<=m; j++)
        {
            cin>>ch;
            if (ch=='I')
            {
                l_start=i;
                c_start=j;
            }
            if (ch=='O')
            {
                l_finish=i;
                c_finish=j;
            }
            if (ch=='D')
            {
                ctd++;
                coada[ctd].l=i;
                coada[ctd].c=j;
                dragoni[i][j]=1;
            }
            if (ch=='*')
            {
                dragoni[i][j]=-1;
                viz[i][j]=-1;
            }
        }
    for (i=0; i<=n+1; i++)
        viz[i][0]=viz[i][m+1]=dragoni[i][0]=dragoni[i][m+1]=-1;
    for (j=0; j<=m+1; j++)
        viz[0][j]=viz[n+1][j]=dragoni[0][j]=dragoni[n+1][j]=-1;
    inc=1;
    sf=ctd;
    while (inc<=sf)
    {
        for (i=0; i<=3; i++)
        {
            lin=coada[inc].l+dirL[i];
            col=coada[inc].c+dirC[i];
            if (dragoni[lin][col]==0 || dragoni[coada[inc].l][coada[inc].c]+1<dragoni[lin][col])
            {
                sf++;
                coada[sf].l=lin;
                coada[sf].c=col;
                dragoni[lin][col]=dragoni[coada[inc].l][coada[inc].c]+1;
            }
        }
        inc++;
    }
    for (i=1; i<=n; i++)
        for (j=1; j<=m; j++)
            if (dragoni[i][j]>=1)
                dragoni[i][j]--;
    st=1;
    dr=dragoni[l_start][c_start]+1;
    ans=-1;
    while (st<=dr)
    {
        mijl=(st+dr)/2;
        for (i=0; i<=n+1; i++)
            for (j=0; j<=m+1; j++)
                if (dragoni[i][j]==-1 || dragoni[i][j]<mijl)
                    viz[i][j]=-1;
                else
                    viz[i][j]=0;
        if (viz[l_start][c_start]==0)
        {
            viz[l_start][c_start]=1;
            inc=1;
            sf=1;
            coada[1].l=l_start;
            coada[1].c=c_start;
            while (inc<=sf)
            {
                for (i=0; i<=3; i++)
                {
                    lin=coada[inc].l+dirL[i];
                    col=coada[inc].c+dirC[i];
                    if (viz[lin][col]==0)
                    {
                        sf++;
                        coada[sf].l=lin;
                        coada[sf].c=col;
                        viz[lin][col]=1;
                    }
                }
                inc++;
            }
        }
        if (viz[l_finish][c_finish]==1)
        {
            st=mijl+1;
            ans=mijl;
        }
        else
            dr=mijl-1;
    }
    cout<<ans;
    return 0;
}