Cod sursa(job #1047235)

Utilizator tavi.belu1994FMI Belu Andrei Octavian tavi.belu1994 Data 4 decembrie 2013 03:51:11
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.01 kb
#include <iostream>
#include <cstdio>
#include <deque>
#define NMAX 2100
FILE *f,*g;
using namespace std;

bool fin = false;
int A[NMAX][NMAX],B[NMAX][NMAX];
int R,C,xi,yi,xf,yf;
int dl[]={-1,0,1,0};
int dc[]={0,1,0,-1};
deque < int > Qx,Qy,Dx,Dy;

void bordare(int N, int M)
{
    for(int i=0 ; i<=N+1 ; i++)
    {
        A[i][0]=A[i][M+1]=B[i][0]=B[i][M+1]=-1;
    }
    for(int i=0 ; i<=N+1 ; i++)
    {
        A[0][i]=A[N+1][i]=B[0][i]=B[N+1][i]=-1;
    }
}

void lee_dragoni()
{
    int x,y;
    while(!Dx.empty())
    {
        x=Dx.front();
        y=Dy.front();
        for(int i=0 ; i<4 ; i++)
        {
            if(x+dl[i]>0 && y+dc[i]>0)
            {
            if(A[x+dl[i]][y+dc[i]]==0)
            {
                if(A[x][y]==-2)
                    A[x+dl[i]][y+dc[i]]=1;
                else
                    A[x+dl[i]][y+dc[i]]=A[x][y]+1;
                Dx.push_back(x+dl[i]);
                Dy.push_back(y+dc[i]);
            }
            }
        }
    Dx.pop_front();
    Dy.pop_front();
    }
}

void lee()
{
    Qx.push_front(xi);
    Qy.push_front(yi);
    if(xi == yi && xf == yf)
        fin = true;
    while(!Qx.empty())
    {
        int x,y;
        x = Qx.front();
        y = Qy.front();
        Qx.pop_front();
        Qy.pop_front();
        for(int k=0 ; k<4 ; k++)
        {
            if(x+dl[k]>0 && y+dc[k]>0)
            {
            if(!B[x + dl[k]][y + dc[k]] && A[x+dl[k]][y+dc[k]]>0)
            {
                if(x + dl[k] == xf && y + dc[k] == yf)
                    fin = true;
                if(A[x+dl[k]][y+dc[k]]>=B[x][y])
                {
                    B[x+dl[k]][y+dc[k]]=B[x][y];
                    Qx.push_front(x+dl[k]);
                    Qy.push_front(y+dc[k]);
                }
                else
                {
                    B[x+dl[k]][y+dc[k]]=A[x+dl[k]][y+dc[k]];
                    Qx.push_back(x+dl[k]);
                    Qy.push_back(y+dc[k]);
                }
            }
            }
        }
    }
}

int main()
{
    f=fopen("barbar.in","r");
    g=fopen("barbar.out","w");
    int i,j;
    fscanf(f,"%d%d\n",&R,&C);
    bordare(R,C);
    for(i=1 ; i<=R ; i++)
    {
        for(j=1 ; j<=C ; j++)
        {
            char a;
            fscanf(f,"%c",&a);
            if(a=='*')
                {A[i][j]=-1; continue;}
            if(a=='.')
                {A[i][j]=0; continue;}
            if(a=='D')
            {
                A[i][j]=-2;
                Dx.push_back(i);
                Dy.push_back(j);
                continue;
            }
            if(a=='I')
                {xi=i; yi=j; A[i][j]=0; continue;}
            if(a=='O')
                {xf=i; yf=j; A[i][j]=0; continue;}
        }
        fscanf(f,"\n");
    }
    fclose(f);
    lee_dragoni();
    B[xi][yi]=A[xi][yi];
    lee();
    if(fin == true)
        fprintf(g,"%d",B[xf][yf]);
    else
        fprintf(g,"-1");
    fclose(g);
    return 0;
}