Cod sursa(job #2242791)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 19 septembrie 2018 15:59:29
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.11 kb
#include <fstream>
#include <queue>

using namespace std;

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

const int N = 1000 + 5;

int n, m;
int v[N][N], len[N][N];
int ri, ci;
int rf, cf;

struct info {
        int r;
        int c;
};

queue <info> q;

inline bool valid(int r, int c) {
        if (1 <= r && 1 <= c && r <= n && c <= m) {
                return 1;
        }
        return 0;
}

int dr[] = {- 1, 0, 1, 0};
int dc[] = {0, 1, 0, - 1};

bool seen[N][N];

inline void dfs(int r, int c, int d) {
        seen[r][c] = 1;
        for (int k = 0; k < 4; k++) {
                int rn = r + dr[k];
                int cn = c + dc[k];
                if (valid(rn, cn) && v[rn][cn] == 0 && seen[rn][cn] == 0 && len[rn][cn] >= d) {
                        dfs(rn, cn, d);
                }
        }
}

inline bool ok(int d) {
        if (len[ri][ci] < d) {
                return 0;
        }
        for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= m; j++) {
                        seen[i][j] = 0;
                }
        }
        dfs (ri, ci, d);
        return seen[rf][cf];
}

int main() {
        fin >> n >> m;
        for (int i = 1; i <= n; i++) {
                string s;
                fin >> s;
                for (int j = 1; j <= m; j++) {
                        if (s[j - 1] == 'I') {
                                ri = i;
                                ci = j;
                                continue;
                        }
                        if (s[j - 1] == 'O') {
                                rf = i;
                                cf = j;
                                continue;
                        }
                        if (s[j - 1] == 'D') {
                                v[i][j] = 1;
                        }
                        if (s[j - 1] == '*') {
                                v[i][j] = 2;
                        }
                }
        }
        for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= m; j++) {
                        if (v[i][j] == 1) {
                                q.push({i, j});
                                len[i][j] = 0;
                        } else {
                                len[i][j] = - 1;
                        }
                }
        }
        while (!q.empty()) {
                int r = q.front().r;
                int c = q.front().c;
                q.pop();
                for (int k = 0; k < 4; k++) {
                        int rn = r + dr[k];
                        int cn = c + dc[k];
                        if (valid(rn, cn) && v[rn][cn] != 2 && len[rn][cn] == - 1) {
                                len[rn][cn] = len[r][c] + 1;
                                q.push({rn, cn});
                        }
                }
        }
        int r = 0, pas = (1 << 30);
        while (pas) {
                if (r + pas <= 2 * N && ok(r + pas) == 1) {
                        r += pas;
                }
                pas /= 2;
        }
        if (ok(r) == 0) {
                r = - 1;
        }
        fout << r << "\n";
        return 0;
}
/**
        1 = dragon
        2 = zid
**/