Cod sursa(job #1025513)

Utilizator jul123Iulia Duta jul123 Data 10 noiembrie 2013 10:15:17
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include<iostream>
#include<fstream>
using namespace std;
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
int r,c, sx, sy, fx, fy, q1[1000000], q2[1000000], si=0, sf=0, c1[1000000], c2[1000000];
char a;
int b[1000][1000], ok=0, d[1000][1000];
void BF()
{
    int k, x, y, max=-1;
    while(si<=sf)
    {
    x=q1[si];
    y=q2[si];
    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;
                q1[sf]=x+dx[k];
                q2[sf]=y+dy[k];
                sf++;

        }
    }
    si++;
}
}
void BFF()
{
    int k,x,y;
    int prim, ultim;
    prim=1000000;
    ultim=1000001;
    c1[prim]=sx;
    c2[prim]=sy;
    if(sx==fx && sy==fy)
        ok=1;
    while(prim<=ultim)
          {
    x=c1[prim];
    y=c2[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]==fx && y+dy[k]==fy)
                ok=1;
            if(b[x+dx[k]][y+dy[k]]>=d[x][y])
            {
            d[x+dx[k]][y+dy[k]]=d[x][y];
            prim--;
            c1[prim]=x+dx[k];
            c2[prim]=y+dy[k];

            }
            else
            {d[x+dx[k]][y+dy[k]]=b[x+dx[k]][y+dy[k]];
            c1[ultim]=x+dx[k];
            c2[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;
                    q1[sf]=i; q2[sf]=j; sf++;}
                if(a=='I')
                    sx=i, sy=j, b[i][j]=0;
                if(a=='O')
                    fx=i, fy=j, b[i][j]=0;
            }


    BF();


    for(i=0;i<r;i++)
        for(j=0;j<c;j++)
            d[i][j]=0;
    d[sx][sy]=b[sx][sy];
    BFF();
    if(ok==1)
        g<<d[fx][fy];
    else
        g<<"-1";
}