Cod sursa(job #1541435)

Utilizator pulseOvidiu Giorgi pulse Data 4 decembrie 2015 01:24:09
Problema Barbar Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <bits/stdc++.h>

using namespace std;

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

#define PII pair<int,int>
#define pb push_back
#define mp make_pair

const int DIM = 1005;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};

int R, C;
int d[DIM][DIM];
char c;
bool used[DIM][DIM];
queue <PII> Q;
PII start, finish;

bool OK(int i, int j)
{
    if(i < 1 || i > R || j < 1 || j > C)
        return 0;
    return 1;
}

bool check(int mindist)
{
    memset(used, 0, sizeof(used));

    if(d[start.first][start.second] <= mindist)
        return 0;

    Q.push(start);

    while(!Q.empty())
    {
        PII node = Q.front();
        Q.pop();
        used[node.first][node.second] = 1;

        for(int dir = 0; dir < 4; ++dir)
        {
            int i = node.first + dx[dir];
            int j = node.second + dy[dir];

            if(OK(i, j) && !used[i][j] && d[i][j] > mindist)
                Q.push(mp(i, j));
        }
    }

    return used[finish.first][finish.second];
}

void walls()
{
    while(!Q.empty())
    {
        PII node = Q.front();
        Q.pop();

        for(int dir = 0; dir < 4; ++dir)
        {
            int i = node.first + dx[dir];
            int j = node.second + dy[dir];

            if(OK(i, j) && d[i][j] == 0)
            {
                d[i][j] = d[node.first][node.second] + 1;
                Q.push(mp(i, j));
            }
        }
    }
}

void bs()
{
    int l = 1, r = R * C + 1;
    int sol = -1;

    walls();

    while(l <= r)
    {
        int mid = (l + r) / 2;

        if(check(mid))
        {
            sol = mid;
            l = mid + 1;
        }
        else
            r = mid - 1;
    }

    fout << sol;
}

int main()
{
    fin >> R >> C;
    for(int i = 1; i <= R; ++i)
    {
        for(int j = 1; j <= C; ++j)
        {
            fin >> c;
            if(c == 'D')
            {
                d[i][j] = 1;
                Q.push(mp(i, j));
                continue;
            }
            if(c== 'I')
            {
                start.first = i;
                start.second = j;
                continue;
            }
            if (c == 'O')
            {
                finish.first = i;
                finish.second = j;
                continue;
            }
            if(c == '*')
                d[i][j] = -1;
        }
    }

    bs();

    return 0;
}