Cod sursa(job #2763895)

Utilizator WilIiamperWilliam Damian Balint WilIiamper Data 17 iulie 2021 16:54:31
Problema Matrice 2 Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>

using namespace std;

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

int n, q, mat[305][305];
bool vis[305][305];

const int ox[] = { 1, -1, 0, 0 };
const int oy[] = { 0, 0, 1, -1};

void solve( int x, int y, const int cost ) {
    vis[ x ][ y ] = true;

    for ( short int l = 0; l < 4; l++ ) {
        int x2 = x + ox[l];
        int y2 = y + oy[l];

        if ( !vis[x2][y2] && mat[x2][y2] >= cost )
            solve( x2, y2, cost );
    }
}

bool PathExists ( int x1, int y1, int x2, int y2, const int cost ) {

    for ( int i = 1; i <= n; i++ ) {
        for ( int j = 1; j <= n; j++ )
            vis[i][j] = false;
    }

    solve( x1, y1, cost );

    if ( vis[ x2 ][ y2 ] )
        return true;
    else
        return false;
}

void BinarySearch ( int x1, int y1, int x2, int y2 ) {

    int lo = 1, hi = min ( mat[x1][y1], mat[x2][y2] );

    while ( lo <= hi ) {

        int mid = lo + ( hi-lo )/2;
        if ( PathExists( x1, y1, x2, y2, mid ) )
            lo = mid + 1;
        else
            hi = mid - 1;
    }

    fout << hi << "\n";
}

void read () {
    fin >> n >> q;
    for ( int i = 1; i <= n; i++ ) {
        for ( int j = 1; j <= n; j++ )
            fin >> mat[i][j];
    }
}

int main()
{
    read();

    int x, y, z, t;
    while ( q-- ) {
        fin >> x >> y >> z >> t;
        BinarySearch( x, y, z, t );
    }
    return 0;
}