Cod sursa(job #1460575)

Utilizator ciocan_catalinCiocan Catalin - Iulian ciocan_catalin Data 13 iulie 2015 11:38:59
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,startx,starty,stopx,stopy;
int d[1005][1005],sol[1005][1005];
char a[1005][1005];
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
queue <pair <int,int> > Q;


void Read()
{
    int i,j;
    char c;
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
    {
        fin>>c;
        a[i][j] = c;
        if(c=='D')
        Q.push(make_pair(i,j));
        else if(c=='I')
        {
            startx = i;
            starty = j;
        }
         else if(c=='O')
        {
            stopx = i;
            stopy = j;
        }
    }
}

bool OK(int i, int j)
{
    if(i>n || j>m || i<1 || j<1) return false;
    return true;
}

void Lee_Dragon()
{
    int i,j,i_next,j_next,dir;
    while(!Q.empty())
    {
        i = Q.front().first;
        j = Q.front().second;
        Q.pop();
        for(dir = 0; dir < 4; dir++)
        {
            i_next = i+dx[dir];
            j_next = j+dy[dir];
            if(OK(i_next,j_next) && a[i_next][j_next]!='D')
            {
                if(d[i_next][j_next]==0 || d[i_next][j_next] > 1+d[i][j])
                {
                    Q.push(make_pair(i_next,j_next));
                    d[i_next][j_next] = 1+d[i][j];
                }
            }
        }
    }

}


void Lee_Paftenie()
{
    int i,j,i_next,j_next,dir;
    Q.push(make_pair(startx,starty));
    sol[startx][starty] = d[startx][starty];
    while(!Q.empty())
    {
        i = Q.front().first;
        j = Q.front().second;
        Q.pop();
        for(dir = 0; dir < 4; dir++)
        {
            i_next = i+dx[dir];
            j_next = j+dy[dir];
            if(OK(i_next,j_next) && a[i_next][j_next]!='*')
            {
                if(sol[i_next][j_next]==0 || (sol[i_next][j_next]< sol[i][j]))
                {
                    Q.push(make_pair(i_next,j_next));
                    sol[i_next][j_next] = min(d[i_next][j_next],sol[i][j]);
                }
            }
        }
    }
    if(sol[stopx][stopy]==0) fout<<"-1\n";
    else
    fout<<sol[stopx][stopy]<<"\n";
}

int main()
{
    Read();
    Lee_Dragon();
    Lee_Paftenie();
    fout.close();
    return 0;
}