Cod sursa(job #2735126)

Utilizator As932Stanciu Andreea As932 Data 1 aprilie 2021 20:30:25
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <bits/stdc++.h>
#define per pair<int,int>

using namespace std;

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

const int lmax = 1e3 + 5;

int n, m, nr, vis[lmax][lmax];
bool v[lmax][lmax];
queue <per> d;
per in, o;
char a[lmax][lmax];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};

void read(){
    fin >> n >> m;

    for(int i = 1; i <= n; i++)
        fin >> (a[i] + 1);
}

void dragons(){
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            if(a[i][j] == 'I')
                in = {i, j};
            else if(a[i][j] == 'O')
                o = {i, j};
            else if(a[i][j] == 'D'){
                vis[i][j] = 1;
                d.push({i, j});
            }
}

bool lim(int i, int j){
    return (i >= 1 && i <= n && j >= 1 && j <= m);
}

void prec(){
    while(!d.empty()){
        per p = d.front();
        d.pop();

        for(int i = 0; i < 4; i++){
            int l = p.first + dx[i];
            int c = p.second + dy[i];

            if(lim(l, c) && a[l][c] != '*' && !vis[l][c]){
                vis[l][c] = vis[p.first][p.second] + 1;
                d.push({l,c});
            }
        }
    }
}

int mx(){
    int nr = 0;

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            nr = max(nr, vis[i][j]);

    return nr;
}

bool bfs(int val){
    memset(v, 0, sizeof(v));
    queue <per> q;

    q.push(in);
    v[in.first][in.second] = 1;

    while(!q.empty()){
        per p = q.front();
        q.pop();

        if(p == o)
            return true;

        for(int i = 0; i < 4; i++){
            int l = p.first + dx[i];
            int c = p.second + dy[i];

            if(lim(l, c) && a[l][c] != '*' && !v[l][c] && vis[l][c] > val){
                v[l][c] = 1;
                q.push({l, c});
            }
        }
    }

    return false;
}

void solve(){
    int l = 1, r = mx(), sol = -1;

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

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

    fout << sol;
}

int main()
{
    read();
    dragons();
    prec();
    solve();

    return 0;
}