Cod sursa(job #2138834)

Utilizator Andrei17Andrei Pascu Andrei17 Data 21 februarie 2018 21:45:37
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

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

const int N = 1001, di[] = {-1,0,1,0}, dj[] = {0,1,0,-1};

int n, m, dist[N][N], x1, y1, x2, y2, viz[N][N];
char a[N][N];

inline bool inbounds(int i, int j) {
    return (i >= 0 && i < n && j >= 0 && j < n);
}

void precalculare_lee(int i, int j, int val) {
    if (!inbounds(i, j) || val >= dist[i][j] || a[i][j] == '*') return;

    dist[i][j] = min(dist[i][j], val);
    for (int k = 0; k < 4; k++) {
        precalculare_lee(i + di[k], j + dj[k], val + 1);
    }
    return;
}

bool lee(int i, int j, int d) {
    if (i == x2 && j == y2) return true;
    if (!inbounds(i, j) || dist[i][j] < d || viz[i][j] == d || a[i][j] == '*') return false;

    bool atins = false;
    viz[i][j] = d;
    for (int k = 0; k < 4; k++) if (!atins) atins = lee(i + di[k], j + dj[k], d);

    return atins;
}

void cautbin() {
    int r = 0, pas = 1 << 20;

    while (pas != 0) {
        if (r + pas <= n && lee(x1, y1, r + pas)) {
            r += pas;
        }
        pas >>= 1;
    }

    if (r == 0) out << -1;
    else out << r;
    out.close();
}

int main()
{
    in >> n >> m;
    for (int i = 0; i < n; i++) memset(dist[i], 1, sizeof(dist[i]));
    for (int i = 0; i < n; i++) in >> a[i];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (a[i][j] == 'D') {
                precalculare_lee(i, j, 0);
            }
            if (a[i][j] == 'I') {
                x1 = i;
                y1 = j;
            }
            if (a[i][j] == 'O') {
                x2 = i;
                y2 = j;
            }
        }
    }
    cautbin();

    //for (int i = 0; i < n; i++) {
    //    for (int j = 0; j < m; j++) out << dist[i][j] << ' ';
    //    out << '\n';
    //}
}