Cod sursa(job #2702224)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 3 februarie 2021 11:02:20
Problema Matrice 2 Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, q, mat[305][305];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
bool viz[305][305];

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

bool Lee(int mid, int x1, int y1, int x2, int y2){
    if (mat[x1][y1] < mid){
        return false;
    }
    memset(viz, 0, sizeof viz);
    queue <pair <int, int> > coada;
    coada.push({x1, y1});
    viz[x1][y1] = true;
    while (!coada.empty()){
        int x = coada.front().first;
        int y = coada.front().second;
        coada.pop();
        for (int k = 0; k < 4; ++k){
            int xx = x + dx[k];
            int yy = y + dy[k];
            if (Inside(xx, yy) && viz[xx][yy] == false && mat[xx][yy] >= mid){
                coada.push({xx, yy});
                viz[xx][yy] = true;
            }
        }
    }
    return viz[x2][y2];
}

int main(){
    fin >> n >> q;
    int maxim = 0;
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= n; ++j){
            fin >> mat[i][j];
            maxim = max(maxim, mat[i][j]);
        }
    }
    while (q--){
        int x1, y1, x2, y2;
        fin >> x1 >> y1 >> x2 >> y2;
        int st = 1, dr = maxim, ans = -1;
        while (st <= dr){
            int mid = (st + dr) / 2;
            if (Lee(mid, x1, y1, x2, y2)){
                ans = mid;
                st = mid + 1;
            }
            else{
                dr = mid - 1;
            }
        }
        fout << ans << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}