Cod sursa(job #2321548)

Utilizator DavvDrgDavid Dragostin DavvDrg Data 16 ianuarie 2019 11:20:04
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.56 kb
#include<stdio.h>
#define NMAX 1010
long lin[]= {1,-1,0,0};
long col[]= {0,0,-1,1};
long w[NMAX][NMAX],qqq,rez,c,aa,bb,in,b,qq,sf,l,x[NMAX][NMAX],y[NMAX][NMAX],z[NMAX][NMAX],i,j,k,n,m,a,xi,yi,xf,yf;
struct kkt
{
    long X,Y,K;
};
kkt q[NMAX*NMAX];
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%ld%ld%c",&n,&m,&c);
    m--;
    for (i=1; i<=n; i++)
    {
        for (j=0; j<=m; j++)
        {
            scanf("%c",&c);
            if (c=='D')
            {
                q[++sf].X=i;
                q[sf].Y=j+1;
                q[sf].K=0;
                y[i][j+1]=1;
            }
            else if (c=='*')
            {
                y[i][j+1]=1;
                w[i][j+1]=1;
            }
            else
            {
                if (c=='I')
                {
                    xi=i;
                    yi=j+1;
                }
                if (c=='O')
                {
                    xf=i;
                    yf=j+1;
                }
            }

        }
        scanf("\n");
    }
    in=1;
    m++;

    while (in<=sf)
    {
        for (i=0; i<=3; i++)
        {
            a=q[in].X+lin[i];
            b=q[in].Y+col[i];
            if (a>=1&&a<=n&&b>=1&&b<=m&&z[a][b]==0&&y[a][b]!=1)
            {
                sf++;
                q[sf].X=a;
                q[sf].Y=b;
                q[sf].K=q[in].K+1;
                z[a][b]=q[sf].K;
            }
        }
        in++;
    }
    k=-1;
    for (i=1; i<=n; i++)
        for (j=1; j<=m; j++)
        {
            if (z[i][j]>k)
                y[i][j]=w[i][j];
        }
    for (j=z[xi][yi]; j>=0; j--)
    {
        in=1;
        sf=1;
        q[1].X=xi;
        q[1].Y=yi;
        y[xi][yi]=1;
        qq=0;
        while (in<=sf)
        {
            for (i=0; i<=3; i++)
            {
                a=q[in].X+lin[i];
                b=q[in].Y+col[i];
                if (a>=1&&a<=n&&b>=1&&b<=m&&y[a][b]!=1&&z[a][b]>=j)
                {
                    if (a==xf&&b==yf)
                    {
                        printf("%ld\n",j);
                        return 0;
                    }
                    sf++;
                    q[sf].X=a;
                    q[sf].Y=b;
                    y[a][b]=1;
                }


            }
            in++;
        }
        for (i=1; i<=n; i++)
            for (l=1; l<=m; l++)
            {
                y[i][l]=w[i][l];
            }
    }
    printf("-1\n");
    return 0;
}