Cod sursa(job #2007316)

Utilizator RaresEGaySopterean Adrian RaresEGay Data 2 august 2017 14:57:04
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.87 kb
#include <fstream>
#include <iostream>
#include <queue>

#define inf 0x3f3f3f3f
#define maxn 1005

using namespace std;

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

void Read();
void BFS();
void Solve();
bool Check(int i, int j);

int dY[4] = {1, -1, 0, 0};
int dX[4] = {0, 0, 1, -1};

int r, c;
pair < int, int > x, y;
int v[maxn][maxn];
int a[maxn][maxn];

queue < pair < int, int > > dr;
queue < pair < int, int > > q;

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

}

void Solve(){
    int hi = min(a[x.first][x.second], a[y.first][y.second]);
    int lo = 0;
    int i, j, in, jn;
    int mid, sol = -1;
    while(lo <= hi){
        int ok = 0;
        mid = (hi + lo) / 2;
        q.push(make_pair(x.first, x.second));
        v[x.first][x.second] = 1;
        while(!q.empty()){
            i = q.front().first;
            j = q.front().second;
            q.pop();
            for(int l = 0; l < 4; ++l){
                in = i + dX[l];
                jn = j + dY[l];
                if(Check(in, jn) && a[in][jn] >= mid && !v[in][jn]){
                    v[in][jn] = 1;
                    q.push(make_pair(in, jn));
                    if(v[y.first][y.second]){
                        sol = max(sol, mid);
                        ok = 1;
                    }
                }
                if(ok) break;
            }
            while(ok && !q.empty()) q.pop();
        }
        for(i = 1; i <= r; ++i){
            for(j = 1; j <= c; ++j)
                v[i][j] = 0;
        }
        if(ok) lo = mid + 1;
        else hi = mid - 1;
    }
    g << sol << '\n';
}

void BFS(){
    while(!dr.empty()){
        q.push(make_pair(dr.front().first, dr.front().second));
        a[dr.front().first][dr.front().second] = 0;
        dr.pop();
        int i, j, in, jn;
        while(!q.empty()){
            i = q.front().first;
            j = q.front().second;
            q.pop();
            for(int l = 0; l < 4; ++l){
                in = i + dX[l];
                jn = j + dY[l];
                if(Check(in, jn)){
                    int dist = a[i][j] + 1;
                    if(dist < a[in][jn]){
                        q.push(make_pair(in, jn));
                        a[in][jn] = dist;
                    }
                }
            }
        }
    }
}

void Read(){
    f >> r >> c;
    for(int i = 1; i <= r; ++i){
        for(int j = 1; j <= c; ++j){
            char k; f >> k;
            a[i][j] = inf;
            if (k == '*') a[i][j] = -1;
            else if (k == 'I') x.first = i, x.second = j;
            else if (k == 'O') y.first = i, y.second = j;
            else if (k == 'D') dr.push(make_pair(i, j));
        }
    }
}

bool Check(int i, int j){
    if(i < 1 or i > r or j < 1 or j > c) return false;
    if(a[i][j] == -1) return false;
    return true;
}