Cod sursa(job #1052671)

Utilizator pop_bogdanBogdan Pop pop_bogdan Data 11 decembrie 2013 17:39:04
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <fstream>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;

#define DIM 1001
const int di[] = {-1,0,1,0};
const int dj[] = {0,1,0,-1};

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

queue <pair<int,int> > Q;

int a[DIM][DIM],n,m,i1,i2,j1,j2;
bool marked[DIM][DIM];
char v,c[DIM][DIM];
int valmax;
int result;

void Read();
void Lee();
bool Test(int x);
void Solve();
bool Ok(int a, int b);

int main()
{
    Read();
    Lee();
    Solve();

    return 0;
}

void Read()
{
    is >> n >> m;
    is.get(v);
    for ( int i = 1; i <= n; ++i )
    {
        for ( int j = 1; j <= m; ++j )
        {
            is.get(v);
            c[i][j] = v;
            if ( v == 'D')
            {
                a[i][j] = 1;
                Q.push(make_pair(i,j));
            }
            if ( v == 'I')
            {
                i1 = i;
                j1 = j;
            }
            if ( v == 'O')
            {
                i2 = i;
                j2 = j;
            }
            if ( v == '*' )
            {
                a[i][j] = -1;
            }
        }
        is.get(v);
    }
}

void Lee()
{
    int i,j,iv,jv;
    while ( !Q.empty() )
    {
        i = Q.front().first; j = Q.front().second;
        Q.pop();
        for ( int d = 0; d < 4; ++d )
        {
            iv = i+di[d];
            jv = j+dj[d];
            if ( Ok(iv,jv) && c[iv][jv] != '*' && a[iv][jv] == 0 && c[iv][jv] != 'D')
            {
                a[iv][jv] = a[i][j] + 1;
                valmax = max(valmax,a[iv][jv]);
                Q.push(make_pair(iv,jv));
            }
        }
    }
}

bool Ok(int a, int b)
{
    if ( a < 1 || b < 1 || a > n || b > m )
        return false;
    return true;
}

bool Test(int x)
{
    int i,j,iv,jv;
    Q.push(make_pair(i1,j1));
    while (!Q.empty() )
    {
        i = Q.front().first;
        j = Q.front().second;
        Q.pop();
        for ( int d = 0; d < 4; ++d )
        {
            iv = i + di[d];
            jv = j + dj[d];
            if ( Ok(iv,jv) && a[iv][jv] >= x && marked[iv][jv] == false )
            {
                marked[iv][jv] = true;
                Q.push(make_pair(iv,jv));
                if ( iv == i2 && jv == j2 )
                {
                    memset(marked,false,sizeof(marked));
                    return true;
                }
            }
        }
    }
    memset(marked,false,sizeof(marked));
    return false;

}

void Solve()
{
    valmax = a[i1][j1];
    for ( int q = valmax; q >= 1; --q )
    if ( Test(q) == true )
    {
        os << q-1;
        break;
    }
}