Cod sursa(job #1051670)

Utilizator tucuConstantin Galatan tucu Data 10 decembrie 2013 13:27:09
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.95 kb
#include <fstream>
#include <iomanip>
#include <vector>
#include <queue>
using namespace std;

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

#define mp make_pair
#define pb push_back
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<char> VC;
typedef vector<VC> VVC;
const int INF = 0x3f3f3f3f;
const int di[] = { -1, 0, 1, 0 },
          dj[] = { 0, 1, 0, -1 };
int m, n, i1, j1, i2, j2, dmax;
VVI d, c;
VVC a;
queue<pair< int, int> > Q;
void Read();
void BF1();
void BF2();
bool Ok ( int i, int j );
void Write();


int main()
{
    Read();
    BF1();
    BF2();
 //   Write();
    os << c[i2][j2] << '\n';
    is.close();
    os.close();
    return 0;
}

#define iv (i + di[k])
#define jv (j + dj[k])

void BF1()
{
        while ( !Q.empty() )
        {
            int i = Q.front().first, j = Q.front().second;
            Q.pop();
            for ( int k = 0; k < 4; k++ )
            {
                if ( Ok( iv, jv ) && d[iv][jv] > d[i][j] + 1 )
                {
                    d[iv][jv] = d[i][j] + 1;
                    dmax = max(dmax, d[iv][jv]);
                    Q.push(mp(iv, jv ));
                }
            }
        }
}

void BF2()
{
        c[i1][j1] = d[i1][j1];
        Q.push(mp(i1, j1));
        while ( !Q.empty() )
        {
            int i = Q.front().first, j = Q.front().second;
            Q.pop();
            for ( int k = 0; k < 4; k++ )
            {
                if ( !Ok( iv, jv ) ) continue;
                int val;
                if (d[iv][jv] < c[i][j] )
                    val = d[iv][jv];
                else
                {
                    if ( c[iv][jv] == INF )
                        val = c[i][j];
                    else
                        val = max(c[iv][jv], c[i][j]);

                }
                if ( val != c[iv][jv] )
                {
                    c[iv][jv] = val;
                    Q.push(mp(iv, jv ));
                }
            }
        }
}

bool Ok( int i, int j )
{
    if ( i < 1 || j < 1 || i > m || j > n )
        return false;
    if ( a[i][j] == '*' || a[i][j] == 'D' )
        return false;
    return true;
}

void Read()
{
    is >> m >> n;
    d = VVI( m + 1, VI( n + 1, INF) );
    c = VVI( m + 1, VI( n + 1, INF) );
    a = VVC( m + 1, VC( n + 1) );
    for ( int i = 1; i <= m; i++ )
        for ( int j = 1; j <= n; j++ )
        {
            is >> a[i][j];
            if ( a[i][j] == 'I' )
                i1 = i, j1 = j;
            if ( a[i][j] == 'O' )
                i2 = i, j2 = j;
            if ( a[i][j] == 'D' )
               Q.push(mp(i,j)), d[i][j] = 0;
        }
}

void Write()
{
    for ( int i = 1; i <= m; i++ )
    {
        for ( int j = 1; j <= n; j++ )
            if ( c[i][j] == INF )
                os << setw(3) << "oo";
            else
                os << setw(3) << c[i][j];
        os << '\n';
    }
}