Cod sursa(job #309543)

Utilizator mihai0110Bivol Mihai mihai0110 Data 30 aprilie 2009 16:53:36
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.42 kb
#include<fstream.h>
ifstream f("barbar.in");
ofstream g("barbar.out");
long n,m,i,j,sx,sy,fx,fy,u,p,l,c,cx[1100001],cy[1100001],a[1001][1001],b[1001][1001],inq[1001][1001];
char ch;
int main()
{
    f>>m>>n;
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
        {
            f>>ch;
            a[i][j]=-1;
            if(ch=='D')
            {
                u++;
                cx[u]=i;
                cy[u]=j;
                a[i][j]=0;
            }
        else
            if(ch=='*')
                a[i][j]=-2;
        else
            if(ch=='I')
            {
                sx=i;
                sy=j;
            }
        else
            if(ch=='O')
            {
                fx=i;
                fy=j;
            }
        }
    p=1;
    while(p<=u)
    {
        l=cx[p];
        c=cy[p];
        if(l-1>0&&a[l-1][c]!=-2&&(a[l-1][c]==-1||a[l][c]+1<a[l-1][c]))
        {
            a[l-1][c]=a[l][c]+1;
            u++;
            cx[u]=l-1;
            cy[u]=c;
        }
        if(l+1<=m&&a[l+1][c]!=-2&&(a[l+1][c]==-1||a[l][c]+1<a[l+1][c]))
        {
            a[l+1][c]=a[l][c]+1;
            u++;
            cx[u]=l+1;
            cy[u]=c;
        }
        if(c+1<=n&&a[l][c+1]!=-2&&(a[l][c+1]==-1||a[l][c]+1<a[l][c+1]))
        {
            a[l][c+1]=a[l][c]+1;
            u++;
            cx[u]=l;
            cy[u]=c+1;
        }
        if(c-1>0&&a[l][c-1]!=-2&&(a[l][c-1]==-1||a[l][c]+1<a[l][c-1]))
        {
            a[l][c-1]=a[l][c]+1;
            u++;
            cx[u]=l;
            cy[u]=c-1;
        }
        p++;
    }
    u=u;
    for(i=1;i<=u;i++)
    {
        cx[i]=0;
        cy[i]=0;
    }
    u=1;
    p=1;
    cx[1]=sx;
    cy[1]=sy;
    b[sx][sy]=a[sx][sy];
    while(p<=u)
    {
        l=cx[p];
        c=cy[p];
        inq[l][c]=0;
        if(l-1>0&&a[l-1][c]!=-2&&(b[l-1][c]==0||b[l][c]>b[l-1][c]))
        {
            b[l-1][c]=b[l][c];
            if(a[l-1][c]<b[l-1][c])
                b[l-1][c]=a[l-1][c];
            if(!inq[l-1][c])
            {
                u++;
                cx[u]=l-1;
                cy[u]=c;
                inq[l-1][c]=1;
            }
        }
        if(l+1<=m&&a[l+1][c]!=-2&&(b[l+1][c]==0||b[l][c]>b[l+1][c]))
        {
            b[l+1][c]=b[l][c];
            if(a[l+1][c]<b[l+1][c])
                b[l+1][c]=a[l+1][c];
            if(!inq[l+1][c])
            {
                u++;
                cx[u]=l+1;
                cy[u]=c;
                inq[l+1][c]=1;
            }
        }
        if(c+1<=n&&a[l][c+1]!=-2&&(b[l][c+1]==0||b[l][c]>b[l][c+1]))
        {
            b[l][c+1]=b[l][c];
            if(a[l][c+1]<b[l][c+1])
                b[l][c+1]=a[l][c+1];
            if(!inq[l][c+1])
            {
                u++;
                cx[u]=l;
                cy[u]=c+1;
                inq[l][c+1]=1;
            }
        }
        if(c-1>0&&a[l][c-1]!=-2&&(b[l][c-1]==0||b[l][c]>b[l][c-1]))
        {
            b[l][c-1]=b[l][c];
            if(a[l][c-1]<b[l][c-1])
                b[l][c-1]=a[l][c-1];
            if(!inq[l][c-1])
            {
                u++;
                cx[u]=l;
                cy[u]=c-1;
                inq[l][c-1]=1;
            }
        }
        p++;
    }
    if(b[fx][fy]!=0)
    g<<b[fx][fy];
    else
    g<<"-1";
    g<<'\n';
    f.close();
    g.close();
    return 0;
}