Cod sursa(job #1235132)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 28 septembrie 2014 20:12:19
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <cstdio>
#define NMmax 1000+10

using namespace std;

struct nod
{
    int l,c,v;
};

nod plecare,final;
nod c[NMmax];

char C;

int n,m,i,j,val,nr,nraux,sol;
int a[NMmax][NMmax];
int D[NMmax][NMmax];

const int dx[5]= {0,0,0,1,-1};
const int dy[5]= {0,1,-1,0,0};

inline void add(int x,int y,int val)
{
    D[x][y]=val;
    c[++nr].l=x;
    c[nr].c=y;
    c[nr].v=val;
}

void verif(nod crt,int x,int val)
{
    if (crt.l==final.l && crt.c==final.c) sol=1;
    if (sol) return;
    a[crt.l][crt.c]=val;
    for (int i=1; i<=4; ++i)
    {
        nod aux;
        aux.l=crt.l+dx[i];
        aux.c=crt.c+dy[i];
        if (a[aux.l][aux.c]==0 && D[aux.l][aux.c]>=x)
            verif(aux,x,val+1);
    }
    a[crt.l][crt.c]=0;

}

inline int cb()
{
    int mij,st,dr;
    st=1;
    dr=n+m-1;
    for (mij=(st+dr)>>1; st<=dr; mij=(st+dr)>>1)
    {
        sol=0;
        if (D[plecare.l][plecare.c]>=mij) verif(plecare,mij,1);
        if (sol) st=mij+1;
        else dr=mij-1;
    }

    if (dr==0 || dr==n+m) dr=-1;

    return dr;
}

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);

    scanf("%d %d\n", &n, &m);
    for (i=1; i<=n; ++i)
    {
        for (j=1; j<=m; ++j)
        {
            scanf("%c", &C);
            if (C=='D')
            {
                a[i][j]=-2;
                add(i,j,0);
                continue;
            }
            if (C=='*')
            {
                a[i][j]=-1;
                continue;
            }
            if (C=='I')
            {
                plecare.l=i;
                plecare.c=j;
                continue;
            }
            if (C=='O')
            {
                final.l=i;
                final.c=j;
                continue;
            }
        }
        scanf("\n");
    }

    for (i=0; i<=n+1; ++i) a[i][0]=a[i][m+1]=-100;
    for (j=0; j<=m+1; ++j) a[0][j]=a[n+1][j]=-100;

    while (nraux<=nr)
    {
        i=c[nraux].l;
        j=c[nraux].c;
        val=c[nraux].v;
        if (!D[i][j-1] && j-1>0) add(i,j-1,val+1);
        if (!D[i][j+1] && j+1<=m) add(i,j+1,val+1);
        if (!D[i-1][j] && i-1>0) add(i-1,j,val+1);
        if (!D[i+1][j] && i+1<=n) add(i+1,j,val+1);
        nraux++;
    }

    printf("%d\n", cb());

    return 0;
}