Cod sursa(job #604013)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 19 iulie 2011 18:22:41
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <cstdio>
#include <queue>

using namespace std;

struct str
{
    int x,y,d;
};

char ch[1024];
int v[1024][1024],u[1024][1024],a[2][4];
queue <str> d,q[2001];

inline int min(int a,int b)
{
    if (a>b)
        return b;
    else
        return a;
}

int main()
{
    int n,m,i,j,x,y,z,t;
    str aux,aux2;
    aux.d=0;
    a[0][0]=1;a[0][2]=-1;a[1][1]=1;a[1][3]=-1;
    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<=n;++j)
            u[i][j]=-1;
    for (i=1;i<=n;++i)
    {
        fgets(ch,1010,stdin);
        for (j=1;j<=m;++j)
        {
            if (ch[j-1]=='.')
                v[i][j]=-2;
            else if (ch[j-1]=='*')
                v[i][j]=-1;
            else if (ch[j-1]=='D')
            {
                v[i][j]=0;
                aux.x=i;
                aux.y=j;
                d.push(aux);
            }
            else if (ch[j-1]=='I')
            {
                v[i][j]=-2;
                x=i;
                y=j;
            }
            else
            {
                v[i][j]=-2;
                z=i;
                t=j;
            }
        }
    }
    while (!d.empty())
    {
        aux=d.front();
        d.pop();
        for (i=0;i<4;++i)
            if (v[aux.x+a[0][i]][aux.y+a[1][i]]==-2)
            {
                v[aux.x+a[0][i]][aux.y+a[1][i]]=v[aux.x][aux.y]+1;
                aux2.x=aux.x+a[0][i];
                aux2.y=aux.y+a[1][i];
                aux2.d=aux.d+1;
                d.push(aux2);
            }
    }
    u[x][y]=v[x][y];
    aux.x=x;
    aux.y=y;
    aux.d=v[x][y];
    for (q[aux.d].push(aux),i=v[x][y];i>=0;--i)
    {
        while (q[i].size())
        {
            aux=q[i].front();
            q[i].pop();
            for (j=0;j<4;++j)
                if (v[aux.x+a[0][j]][aux.y+a[1][j]]>0&&u[aux.x+a[0][j]][aux.y+a[1][j]]==-1)
                {
                    aux2.x=aux.x+a[0][j];
                    aux2.y=aux.y+a[1][j];
                    aux2.d=min(i,v[aux.x+a[0][j]][aux.y+a[1][j]]);
                    u[aux2.x][aux2.y]=aux2.d;
                    q[aux2.d].push(aux2);
                }
        }
    }
    printf("%d\n",u[z][t]);
    return 0;
}