Cod sursa(job #894106)

Utilizator ard_procesoareLupicu ard_procesoare Data 26 februarie 2013 19:43:55
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.79 kb
#include <fstream>
#include <queue>
using namespace std;
#define NMAX 1005
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,v[NMAX][NMAX],d[NMAX][NMAX],drum[NMAX][NMAX],x1,x2,y1,y2;
queue <int> qx,qy,qval;
int viz[NMAX][NMAX],verif;
bool check[NMAX][NMAX];
void read()
{
    fin>>n>>m;
    char k;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            fin>>k;
            if(k == '*')
            {
                v[i][j] = 1;
                continue;
            }
            if(k == 'I')
            {
                x1=i;
                y1=j;
                v[i][j] = -1;
                continue;
            }
            if(k == 'D')
            {
                v[i][j] = 2;
                qx.push(i);
                qy.push(j);
                qval.push(0);
                viz[i][j] = 1;
                continue;
            }
            if(k == 'O')
            {
                v[i][j] = -2;
                x2=i;
                y2=j;
            }
        }
    }
}
void tipar()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            fout<<d[i][j]<<" ";
        fout<<"\n";
    }
}
void baga(int x,int y,int pas)
{
    if(x>n || y>m) return;
    if(!x || !y) return;
    if(viz[x][y] == verif) return;
    viz[x][y] = verif;
    qx.push(x);
    qy.push(y);
    qval.push(pas);
    d[x][y] = pas;
}
void bfs_dragoni()
{
    int x,y,pas;
    verif = 1;
    while(!qx.empty())
    {
        x=qx.front();
        y=qy.front();
        pas=qval.front() + 1;
        qx.pop();
        qy.pop();
        qval.pop();
        baga(x+1,y,pas);
        baga(x-1,y,pas);
        baga(x,y+1,pas);
        baga(x,y-1,pas);
    }
}
int minim(int a,int b)
{
    if(a>b) return b;
    return a;
}
void baga2(int x,int y,int pas)
{
    if(x==0 || y==0) return;
    if(x>n || y>m) return;
    if(viz[x][y] == verif  &&  pas <= drum[x][y]) return;
    if(v[x][y] == 1) return;
    viz[x][y] = verif;
    drum[x][y] = minim ( pas , d[x][y] );
    if(check[x][y] == false)
    {
        qx.push(x);
        qy.push(y);
    }
    check[x][y] = true;
}
void bfs_drum()
{
    int x,y,pas;
    qx.push(x1);
    qy.push(y1);
    viz[x1][y1] = 2;
    drum[x1][y1] = d[x1][y1];
    qval.push(d[x1][y1]);
    verif = 2;
    while(!qx.empty())
    {
        x=qx.front();
        y=qy.front();
        pas=drum[x][y];
        qx.pop();
        qy.pop();
        check[x][y] = false;
        baga2(x+1,y,pas);
        baga2(x-1,y,pas);
        baga2(x,y+1,pas);
        baga2(x,y-1,pas);
    }
}
int main()
{
    read();
    bfs_dragoni();
    bfs_drum();
   // tipar();
    if(viz[x2][y2] != verif)
        fout<<-1;
    else
        fout<<drum[x2][y2];
}