Cod sursa(job #2201160)

Utilizator GarboteialexGarbotei Alex Garboteialex Data 3 mai 2018 19:48:04
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;

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

#define DM 501

int r,c;
char m[DM][DM];
pair < int, int > sp, fp; // starting point
queue < pair < int, int > > in;
int distmin[DM][DM];
int path[DM][DM];
int di[4] = {0, 1, 0, -1};
int dj[4] = {1, 0, -1, 0};

bool inside(int i, int j) {
    return (i >= 1 && i <= r && j >= 1 && j <= c);
}

void in0() {
    for(int i = 1; i <= r; i++) {
        for(int j = 1; j <= c; j++) {
            path[i][j] = 0;
        }
    }
}

bool verifbin(int x) {
    in0();
    queue < pair < int, int > > fb;
    fb.push(make_pair(sp.first, sp.second));

    while(!fb.empty()) {
        int nodi = fb.front().first;
        int nodj = fb.front().second;
        fb.pop();
        for(int i = 0; i < 4; i++) {
            int newi = nodi + di[i];
            int newj = nodj + dj[i];
            if(inside(newi, newj) && m[newi][newj] != '*' && distmin[newi][newj] >= x && !path[newi][newj]) {
                path[newi][newj] = path[nodi][nodj] + 1;
                fb.push(make_pair(newi, newj));
            }
        }
    }
    if(path[fp.first][fp.second]) {
        return true;
    }
    return false;
}

int bin() {
    int lo = 1, hi = max(r,c), mid;
    while(lo < hi) {
        mid = (lo + hi) / 2;
        if(verifbin(mid)) {  //>= x
            lo = mid;
        } else {
            hi = mid - 1;
        }
    }
    return hi;
}    

int main() {
    fin >> r >> c;
    fin.get();
    for(int i = 1; i <= r; i++) {
        fin.getline(m[i] + 1, DM);
    }

    for(int i = 1; i <= r; i++) {
        for(int j = 1; j <= c; j++) {
            if(m[i][j] == 'D') {
                in.push(make_pair(i, j));
            } else if(m[i][j] == 'I') {
                sp.first = i;
                sp.second = j;
            } else if(m[i][j] == 'O') {
                fp.first = i;
                fp.second = j;
            }
        }
    }

    while(!in.empty()) {
        int nodi = in.front().first;
        int nodj = in.front().second;
        in.pop();
        for(int i = 0; i < 4; i++) {
            int newi = nodi + di[i];
            int newj = nodj + dj[i];
            if(inside(newi, newj) && m[newi][newj] != 'D' && m[newi][newj] != '*' && !distmin[newi][newj]) {
                distmin[newi][newj] = distmin[nodi][nodj] + 1;
                in.push(make_pair(newi, newj));
            }   // completez lee-ul actual,din fiecare dragon, fac functia de cautare binara si verific cu un alt lee
        }
    }

    fout << bin();
}