Cod sursa(job #1148324)

Utilizator gedicaAlpaca Gedit gedica Data 20 martie 2014 17:59:29
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.2 kb
#include <iostream>
#include<queue>
#include<cmath>
#include<algorithm>
#include<fstream>

#define maxn 1001

using namespace std;

int r, c, d_max=0;
char m[maxn][maxn];
int d[maxn][maxn];
int viz[maxn][maxn];

pair <int , int > start;
pair <int, int > finish;
queue < pair <int,int> > coada;

int verificare(int i, int j)
{
    if ((i >= 0) && (i < r) && (j >= 0) && (j < c))
        return 1;
    return 0;

}

void bfs_pe_matrice()
{
    int r_actual, c_actual;
    int v1[] = {0 , 0 , 1 , -1};
    int v2[] = {1 , -1 , 0 , 0};


    while ( !coada.empty() )
    {
        pair < int , int > cc;
        cc=coada.front();
        coada.pop();

        for(int i=0; i<4; i++)
        {
            r_actual=cc.first+ v1[i];
            c_actual=cc.second+ v2[i];

            if ((verificare(r_actual,c_actual)) && (d[r_actual][c_actual]==0) && (m[r_actual][c_actual]!='*'))
            {
                d[r_actual][c_actual]=d[cc.first][cc.second] +1;
                coada.push(pair< int, int >(r_actual,c_actual));
                d_max=max(d_max, d[r_actual][c_actual]);
            }
        }
    }
}

void bfss()
{
    queue < pair<int,int> > bl;
    queue < pair<int,int> > q;
    int r_actual, c_actual;

    int v1[] = {0 , 0 , 1 , -1};
    int v2[] = {1 , -1 , 0 , 0};


    bool valid=true;

    bl.push(start);

    while ((!bl.empty()) && (d_max>=0))
    {

        while (!bl.empty())
        {
            pair <int,int> cc=bl.front();
            bl.pop();

            q.push(cc);
        }


        while (!q.empty())
        {
            pair< int, int > cc;
            cc=q.front();
            q.pop();

            valid=true;

            for (int i=0; i<4; i++)
            {
                r_actual= cc.first+ v1[i];
                c_actual= cc.second+ v2[i];

                if ((verificare(r_actual, c_actual)) && (!viz[r_actual][c_actual]) && (d[r_actual][c_actual]>=d_max) && (m[r_actual][c_actual]!='*'))
                {
                    viz[r_actual][c_actual]=1;
                    q.push(pair<int,int>(r_actual,c_actual));
                    valid=false;

                }

            }

            if (valid)
            {
                bl.push(pair<int,int>(cc.first, cc.second));
            }

        }

        if (viz[finish.first][finish.second])
            return;
        if (!bl.empty())
        {
            d_max--;
        }

    }
}

ifstream in("barbar.in");
ofstream out("barbar.out");

int main()
{

    ifstream in("barbar.in");
    ofstream out("barbar.out");

    in>>r>>c;

    //init
    for (int i=0; i<r; i++)
        for (int j=0; j<c; j++)
        {
            in>>m[i][j];
            if (m[i][j]=='I')
            {
                start=pair<int,int>(i, j);
            }
            else if (m[i][j]=='D')
            {
                coada.push(pair <int,int>(i,j));
            }
            else if (m[i][j]=='O')
            {
                finish=pair<int,int>(i,j);
            }
        }
       //init
        bfs_pe_matrice();
        bfss();
        out<<min( d_max, d[start.first][start.second] );


    return 0;
}