Cod sursa(job #2303106)

Utilizator OctavianVasileVasileOctavian OctavianVasile Data 15 decembrie 2018 16:56:00
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <bits/stdc++.h>
using namespace std;
#define NMAX 1003
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
int n, m, X, Y, I, J, st = 1, dr = 1013, ans;
int dist [NMAX][NMAX];
bitset <NMAX> vizitat [NMAX], v [NMAX];
int di [4] = {0 , 1 ,  0 , -1};
int dj [4] = {1 , 0 , -1 ,  0};
string s;
queue <pair <int , int> > Quadda;
bool valid (int x , int y){
    if (x > 0 && x <= n && y > 0 && y <= m)return 1;
    return 0;
}
void LeeDragon (){
    while (!Quadda.empty ()){
        int l = Quadda.front ().first;
        int c = Quadda.front ().second;
        Quadda.pop ();
        for (int k = 0; k < 4; k ++){
            int L = l + di [k];
            int C = c + dj [k];
            if (valid (L, C) && !v [L][C] && !vizitat [L][C]){
                dist [L][C] = dist [l][c] + 1;
                vizitat [L][C] = 1;
                Quadda.push ({L, C});
            }
        }
    }
}
int LeePaftenie (int d){
    if (dist [X][Y] < d)return 0;
    while (!Quadda.empty ())Quadda.pop ();
    memset (vizitat, 0, sizeof vizitat);
    Quadda.push ({X, Y});
    vizitat [X][Y] = 1;
    while (!Quadda.empty ()){
        int l = Quadda.front ().first;
        int c = Quadda.front ().second;
        Quadda.pop ();
        for (int k = 0; k < 4; k ++){
            int L = l + di [k];
            int C = c + dj [k];
            if (L == I && C == J && dist [L][C] >= d)return 1;
            if (valid (L, C) && !v [L][C] && !vizitat [L][C] && dist [L][C] >= d){
                vizitat [L][C] = 1;
                Quadda.push ({L, C});
            }
        }
    }
    return 0;
}
int main (){
    fin >> n >> m;
    for (int i = 1; i <= n; i ++){
        fin >> s;
        for (int k = 0; k < m; k ++){
            if (s [k] == 'I')X = i, Y = k + 1;
            else if (s [k] == 'O')I = i, J = k + 1;
            else if (s [k] == 'D')vizitat [i][k + 1] = 1, Quadda.push ({i, k + 1});
            else if (s [k] == '*')v [i][k + 1] = 1;
        }
    }LeeDragon ();
    while (st <= dr){
        int mij = (st + dr) / 2;
        if (LeePaftenie (mij))st = mij + 1, ans = mij;
        else dr = mij - 1;
    }
    if (ans)fout << ans;
    else fout << -1;
    return 0;
}