Cod sursa(job #2735091)

Utilizator As932Stanciu Andreea As932 Data 1 aprilie 2021 20:09:42
Problema Barbar Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 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];
per in, o, v[lmax * lmax];
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')
                v[++nr] = {i, j};
}

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

void filll(int l, int c, int d){
    for(int i = 0; i < 4; i++){
        int l1 = l + dx[i];
        int c1 = c + dy[i];

        if(lim(l1, c1) && a[l1][c1] != '*' && vis[l][c] < d && !vis[l1][c1]){
            vis[l1][c1] = vis[l][c] + 1;
            filll(l1, c1, d);
        }
    }
}

bool bfs(){
    queue <per> q;
    q.push(in);

    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] != '*' && !vis[l][c]){
                vis[l][c] = 1;
                q.push({l, c});
            }
        }
    }

    return false;
}

bool okay(int d){
    memset(vis, 0, sizeof(vis));

    for(int i = 1; i <= nr; i++){
        vis[v[i].first][v[i].second] = 1;
        filll(v[i].first, v[i].second, d);
    }

    return (bfs());
}

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

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

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

    fout << sol;
}

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

    return 0;
}