Cod sursa(job #2888003)

Utilizator hobbitczxdumnezEU hobbitczx Data 10 aprilie 2022 16:05:40
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3F3F3F3F
using namespace std;

const string fisier = "barbar";

ifstream fin (fisier + ".in");
ofstream fout (fisier + ".out");

const int dx[] = {-1 , 1 , 0 , 0},
          dy[] = {0 , 0 , -1 , 1};
const int N_MAX = 1e3 + 5;

char ch;
int used[N_MAX][N_MAX] , a[N_MAX][N_MAX] , n , m , ist , jst , ifn , jfn;
vector<pair<int , int>>blocked , dragon;

inline bool inside (int x , int y){
    return (x > 0 && y > 0 && x <= n && y <= m);
}

bool solve(int x){
    memset(used , 0 , sizeof(used));
    memset(a , 0 , sizeof(a));
    queue<pair<int , int>>q;
    for (auto i : dragon){
        q.push({i.first , i.second});
        used[i.first][i.second] = 1;
    }
    while (q.empty() == false){
        int i = q.front().first , j = q.front().second;
        for (int k=0; k<4; k++){
            int iv = i + dx[k] , jv = j + dy[k];
            if (inside(iv , jv) && used[iv][jv] == 0 && used[i][j] + 1 <= x){
                used[iv][jv] = used[i][j] + 1;
                q.push(make_pair(iv , jv));
            }
        }
        q.pop();
    }
    for (auto i : blocked){
        used[i.first][i.second] = 1;
    }
    q.push({ist , jst});
    a[ist][jst] = 1;
    while (!q.empty()){
        int i = q.front().first , j = q.front().second;
        for (int k=0; k<4; k++){
            int iv = i + dx[k] , jv = j + dy[k];
            if (inside(iv , jv) && used[iv][jv] == 0 && a[iv][jv] == 0 && a[ifn][jfn] == 0){
                q.push(make_pair(iv , jv));
                a[iv][jv] = a[i][j] + 1;
            }
        }
        q.pop();
    }
    return a[ifn][jfn];
}

int solve (){
    int st = 1 , dr = 500 , ans = 0;
    while (st <= dr){
        int mij = (st + dr) / 2;
        if (solve(mij)){
            ans = max(ans , mij);
            st = mij + 1;
        }
        else{
            dr = mij - 1;
        }
    }
    return ((ans == 0) ? -1 : ans);
}

int main(){
    ios_base::sync_with_stdio(false);
    fin >> n >> m;
    for (int i=1; i<=n; i++){
        for (int j=1; j<=m; j++){
            fin >> ch;
            if (ch == 'D'){
                dragon.push_back({i , j});
            }
            else if (ch == 'O'){
                ifn = i , jfn = j;
            }
            else if (ch == 'I'){
                ist = i , jst = j;
            }
            else if (ch == '*'){
                blocked.push_back({i , j});
            }
        }
    }
    fout << solve();
}