Cod sursa(job #1025139)

Utilizator jul123Iulia Duta jul123 Data 9 noiembrie 2013 15:40:20
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 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;
char a;
int b[1000][1000], ok=0, d[1000][1000];
void BF(int x, int y)
{
    int k;
    for( k = 0; k <= 3 ; k ++)
    {
       if((b[x+dx[k]][y+dy[k]]>0) && (b[x+dx[k]][y+dy[k]]>b[x][y]+1) && 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;
            BF(x+dx[k],y+dy[k]);
        }
    }
}
void BFF(int x, int y)
{
    if(x==fx && y==fy)
        ok=1;
    int k;
    for(k=0; k <=3; k++)
    {
        if((d[x+dx[k]][y+dy[k]]>0)&& d[x][y]>d[x+dx[k]][y+dy[k]]  && x+dx[k]<r && y+dy[k]<c && x+dx[k]>=0 &&y+dy[k]>=0)
        {
            int t=min(b[x+dx[k]][y+dy[k]], d[x][y]);
           t=max(t, d[x+dx[k]][y+dy[k]]);
             d[x+dx[k]][y+dy[k]]=t;
        BFF(x+dx[k], y+dy[k]);
    }
    }

}
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]=100000;
                if(a=='D')
                    b[i][j]=-2;
                if(a=='I')
                    sx=i, sy=j, b[i][j]=100000;
                if(a=='O')
                    fx=i, fy=j, b[i][j]=100000;
            }

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