Cod sursa(job #2971472)

Utilizator CosminDMRCosmin Damureanu CosminDMR Data 27 ianuarie 2023 14:18:09
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <fstream>
#include <queue>
#include <cstring>
#define dim 1005
using namespace std;
ifstream in ("barbar.in");
ofstream out("barbar.out");
int n, m, d[dim][dim], xi, yi, xf, yf, sol;
short int a[dim][dim];
bool viz[dim][dim];
char ch;
int dx[] = {0, 1, 0, -1, 0},
    dy[] = {0, 0, 1, 0, -1};
struct point {
    int l;
    int c;
};
queue <point> q;
bool inside(int i, int j)
{
    return i >= 1 && i <= n && j >= 1 && j <= m;
}
bool lee(int k)
{
    memset(viz, 0, sizeof(viz));
    if (d[xi][yi] > k) {
        q.push({xi, yi});
        viz[xi][yi] = 1;
    }
    else
        return false;
    while (!q.empty()) {
        int l = q.front().l,
            c = q.front().c;
        q.pop();
        for (int dir = 1; dir <= 4; dir++) {
            int lv = l + dx[dir],
                cv = c + dy[dir];
            if (inside(lv, cv) && !a[lv][cv] && viz[lv][cv] == false && d[lv][cv] > k) {
                viz[lv][cv] = true;
                q.push({lv, cv});
            }
        }
    }
    return viz[xf][yf];
}
int main()
{
    in >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) {
            in >> ch;
            if (ch == 'D') {
                a[i][j] = 2;
                q.push({i, j});
                d[i][j] = 1;
            }
            else if (ch == '*')
                a[i][j] = 1;
            else if (ch == 'I') {
                xi = i,
                yi = j;
            }
            else if (ch == 'O'){
                xf = i,
                yf = j;
            }
        }
    while (!q.empty()) {
        int l = q.front().l,
            c = q.front().c;
        q.pop();
        for (int dir = 1; dir <= 4; dir++) {
            int lv = l + dx[dir],
                cv = c + dy[dir];
            if (inside(lv, cv) && !a[lv][cv] && !d[lv][cv]) {
                d[lv][cv] = d[l][c] + 1;
                q.push({lv, cv});
            }
        }
    }
    int st = 0, dr = n * m;
    sol = -1;
    while (st <= dr) {
        int mid = (st + dr) / 2;
        bool ok = lee(mid);
        if (ok) {
            sol = mid;
            st = mid + 1;
        }
        else
            dr = mid - 1;
    }
    out << sol;
    return 0;
}