Cod sursa(job #2026626)

Utilizator StefanManolacheManolache Stefan StefanManolache Data 24 septembrie 2017 19:05:00
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.97 kb
#include <cstdio>
#include <vector>
FILE *fin = fopen("barbar.in", "r");
FILE *fout = fopen("barbar.out", "w");

#define maxn 1000

std::vector<std::pair<int,int>> dragoni;
int l, c, p = 0, u = 0, n, m;
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
struct poz {
    short int lin;
    short int col;
};
poz q[maxn * maxn + 1];
short int a[maxn + 3][maxn + 3];
bool viz[maxn + 3][maxn + 3];

void fill (int i, int j) {
    viz[i][j] = 1;
    for (int k = 0; k <= 3; k++) {
        if (viz[i + dx[k]][j + dy[k]] == 0)
            fill(i + dx[k], j + dy[k]);
    }
}

inline void lee(int x, int y) {
    p = 0;
    u = 0;
    q[0].lin = x;
    q[0].col = y;
    a[x][y] = 0;
    viz[x][y] = 1;
    while (p <= u) {
        l = q[p].lin;
        c = q[p].col;
        p++;
        for (int i = 0; i <= 3; i++) {
            if (viz[l + dx[i]][c + dy[i]] == 0 && a[l + dx[i]][c + dy[i]] != -1) {
                if (a[l][c] + 1 < a[l + dx[i]][c + dy[i]] || a[l + dx[i]][c + dy[i]] == 0) {
                    u++;
                    q[u].lin = l + dx[i];
                    q[u].col = c + dy[i];
                    a[l + dx[i]][c + dy[i]] = a[l][c] + 1;
                    viz[l + dx[i]][c + dy[i]] = 1;
                }
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++)
            viz[i][j] = 0;
    }
}

int main() {
    int x1, y1, x2, y2, rez;
    fscanf(fin, "%d%d", &n, &m);
    char ch = fgetc(fin);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            char ch = fgetc(fin);
            if (ch == 'I') {
                x1 = i;
                y1 = j;
            }
            else if (ch == 'O') {
                x2 = i;
                y2 = j;
            }
            else if (ch == '*')
                a[i][j] = -1;
            else if (ch == 'D') {
                dragoni.push_back (std::make_pair(i, j));
                a[i][j] = -2;
            }
        }
        char ch = fgetc(fin);
    }
    for (int i = 0; i <= n + 1; i++) {
        a[i][0]= -1;
        a[i][m+1]= -1;

    }
    for (int i = 0; i <= m + 1; i++) {
        a[0][i]= -1;
        a[n+1][i]= -1;
    }
    for (auto it : dragoni) {
        int x = it.first;
        int y = it.second;
        lee(x, y);

    }
    int st = 0;
    int dr = n;
    int t = 0;
    while (st < dr && t < 10) {
        t++;
        int x = (st + dr) / 2;
        for (int i = 0; i <= n + 1; i++) {
            for (int j = 0; j <= m + 1; j++) {
                if (a[i][j] < x && i != x2 && j != y2)
                    viz[i][j] = 1;
            }
        }
        fill(x1, y1);
        if (viz[x2][y2] == 1)
            st = x;
        else
            dr = x - 1;
        rez = x;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++)
                viz[i][j] = 0;
        }

    }
    fprintf(fout, "%d", rez);
    return 0;
}