Cod sursa(job #1359125)

Utilizator dianaa21Diana Pislaru dianaa21 Data 24 februarie 2015 21:21:30
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <fstream>
#include <queue>
#define nmax 1010
using namespace std;
ifstream is ("barbar.in");
ofstream os ("barbar.out");

queue <pair<int,int> >Q;
const int lin[] = {-1, 0, 1, 0};
const int col[] = {0, 1, 0, -1};
int D[nmax][nmax];
int N, M, L, R, si, sj, fi, fj, MAX, val, ANSW;
bool Vis[nmax][nmax], A[nmax][nmax];

void Read();
void Lee();
bool Ok(int,int);
bool Find();

int main()
{
    Read();
    Lee();
    L = 1, R = MAX;

    while( L <= R)
    {
        val = (L+R)/2;
        Q.push({si, sj});
        if(Find()) L = val+1, ANSW = val;
        else R = val-1;
    }
    if(!ANSW) os << -1;
    else os << ANSW;

    is.close();
    os.close();
    return 0;
}
void Read()
{
    char ch;
    is >> N >> M;
    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= M; ++j)
        {
            is >> ch;
            switch(ch) {
                case '*':
                    A[i][j] = true;
                    break;
                case 'D':
                    A[i][j] = true;
                    Q.push({i, j});
                    break;
                case 'I':
                    si = i, sj = j;
                    break;
                case 'O':
                    fi = i, fj = j;
                    break;
            }
        }
}
void Lee()
{
    int i, j, vi, vj;
    while(!Q.empty())
    {
        i = Q.front().first;
        j = Q.front().second;
        Q.pop();
        for(int d = 0; d < 4; ++d)
        {
            vi = i + lin[d];
            vj = j + col[d];
            if(Ok(vi, vj) && (D[vi][vj] > D[i][j] + 1 || !D[vi][vj]))
            {
                D[vi][vj] = D[i][j] + 1;
                Q.push({vi, vj});
                MAX = max(MAX, D[vi][vj]);
            }
        }
    }
}
bool Ok(int i, int j)
{
    if(!i || !j || i > N || j > M)
        return false;
    if(A[i][j])
        return false;
    return true;
}
bool Find()
{
    int i, j, vi, vj;

    if(D[si][sj] < val)
        return false;

    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= M; ++j)
            Vis[i][j] = false;
    Vis[si][sj] = true;

    while(!Q.empty())
    {
        i = Q.front().first;
        j = Q.front().second;
        Q.pop();
        for(int d = 0; d < 4; ++d)
        {
            vi = i + lin[d];
            vj = j + col[d];
            if(Ok(vi, vj) && !Vis[vi][vj] && D[vi][vj] >= val)
            {
                Vis[vi][vj] = true;
                Q.push({vi, vj});
            }
        }
    }
    return Vis[fi][fj];
}