Cod sursa(job #2908755)

Utilizator rares89_Dumitriu Rares rares89_ Data 5 iunie 2022 18:03:05
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <fstream>
#include <cstring>
#include <queue>
#define INF 0x3f3f3f3f

using namespace std;

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

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

int n, m, is, js, iF, jF, matrLee[1005][1005], dist[1005][1005];
char v[1005][1005];

bool inMat(int i, int j) {
    return i >= 1 && i <= n && j >= 1 && j <= m;
}

void lee() {
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            if(v[i][j] != '*' && v[i][j] != 'D') {
                matrLee[i][j] = INF;
            }
        }
    }
    queue<pair<int, int>> Q;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            if(v[i][j] == 'D') {
                Q.push({i, j});
            }
        }
    }
    while(!Q.empty()) {
        int i = Q.front().first;
        int j = Q.front().second;
        Q.pop();
        for(int d = 0; d < 4; d++) {
            int ii = i + di[d];
            int jj = j + dj[d];
            if(inMat(ii, jj) && v[ii][jj] != '*' && v[ii][jj] != 'D' && matrLee[ii][jj] > matrLee[i][j] + 1) {
                matrLee[ii][jj] = matrLee[i][j] + 1;
                Q.push({ii, jj});
            } 
        }
    }
}

bool valid(int raza) {
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            dist[i][j] = INF;
        }
    }
    queue<pair<int, int>> Q;
    Q.push({is, js});
    dist[is][js] = 0;
    while(!Q.empty()) {
        int i = Q.front().first;
        int j = Q.front().second;
        Q.pop();
        for(int d = 0; d < 4; d++) {
            int ii = i + di[d];
            int jj = j + dj[d];
            if(inMat(ii, jj) && v[ii][jj] != '*' && v[ii][jj] != 'D' && dist[ii][jj] > dist[i][j] + 1 &&
                matrLee[i][j] >= raza) {
                dist[ii][jj] = matrLee[i][j] + 1;
                Q.push({ii, jj});
            }
        }
    }
    return dist[iF][jF] != INF;
}

int main() {
    fin >> n >> m;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            fin >> v[i][j];
            if(v[i][j] == 'I') {
                is = i, js = j;
            } else if(v[i][j] == 'O') {
                iF = i, jF = j;
            }
        }
    }
    fin.close();
    lee();
    int st = 1, dr = matrLee[is][js], ans = -1;
    while(st <= dr) {
        int mid = (st + dr) / 2;
        if(valid(mid)) {
            ans = mid;
            st = mid + 1;
        } else {
            dr = mid - 1;
        }
    }
    fout << ans;
    return 0;
}