Cod sursa(job #1082337)

Utilizator leontinLeontin leontin Data 14 ianuarie 2014 15:18:49
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.7 kb
#include<fstream>

#include<iostream>

using namespace std;
int dx[]= {0,0,-1,1};
int dy[]= {-1,1,0,0};
int r,c, var1, var2, f1, f2, coada1[1000000];
int coada2[1000000], cea=0, aqe=0, vec1[1000000], vec2[1000000];
char a;
int b[1000][1000], ok=0, d[1000][1000];
void sub()
{
    int k, x, y, maxxx=-1;
    while(cea<=aqe)
    {
        x=coada1[cea];

        y=coada2[cea];
        for( k = 0; k <= 3 ; k ++)
        {

            if((b[x+dx[k]][y+dy[k]]==0) && x+dx[k]<r && y+dy[k]<c && x+dx[k]>=0 &&y+dy[k]>=0)

            {
                if(b[x][y]==-2)

                    b[x+dx[k]][y+dy[k]]=1;

                else
                    b[x+dx[k]][y+dy[k]]=b[x][y]+1;

                coada1[aqe]=x+dx[k];

                coada2[aqe]=y+dy[k];

                aqe++;

            }
        }
        cea++;
    }
}
void Lee()
{
    int k,x,y;

    int prim, ultim;

    prim=1000000;

    ultim=1000001;

    vec1[prim]=var1;

    vec2[prim]=var2;

    if(var1==f1 && var2==f2)
        ok=1;
    while(prim<=ultim)
    {
        x=vec1[prim];
        y=vec2[prim];
        prim++;
        for(k=0; k <=3; k++)
        {
            if((d[x+dx[k]][y+dy[k]]==0)&& b[x+dx[k]][y+dy[k]]>0 && x+dx[k]<r && y+dy[k]<c && x+dx[k]>=0 &&y+dy[k]>=0)
            {
                if(x+dx[k]==f1 && y+dy[k]==f2)
                    ok=1;
                if(b[x+dx[k]][y+dy[k]]>=d[x][y])
                {
                    d[x+dx[k]][y+dy[k]]=d[x][y];
                    prim--;
                    vec1[prim]=x+dx[k];
                    vec2[prim]=y+dy[k];

                }
                else
                {
                    d[x+dx[k]][y+dy[k]]=b[x+dx[k]][y+dy[k]];
                    vec1[ultim]=x+dx[k];
                    vec2[ultim]=y+dy[k];
                    ultim++;
                }
            }
        }
    }
}
int main()
{
    ifstream f("barbar.in");
    ofstream g("barbar.out");
    int i, j;
    f>>r>>c;
    for(i = 0; i < r; i++)
        for(j = 0; j < c; j ++)
        {
            f>>a;
            if(a=='*')
                b[i][j]=-1;
            if(a=='.')
                b[i][j]=0;
            if(a=='D')
            {
                b[i][j]=-2;
                coada1[aqe]=i;
                coada2[aqe]=j;
                aqe++;
            }
            if(a=='I')
                var1=i, var2=j, b[i][j]=0;
            if(a=='O')
                f1=i, f2=j, b[i][j]=0;
        }


    sub();


    for(i=0; i<r; i++)
        for(j=0; j<c; j++)
            d[i][j]=0;
    d[var1][var2]=b[var1][var2];
    Lee();
    if(ok==1)
        g<<d[f1][f2]<<endl;
    else
        g<<"-1"<<endl;
}