Cod sursa(job #1952232)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 3 aprilie 2017 23:52:34
Problema Matrice 2 Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <iostream>
#include <cstring>

using namespace std;

ifstream f("matrice2.in");
ofstream g("matrice2.out");

int n, m, i, j, a[305][305];
int x1, Y1, x2, y2, x, y, xx, yy;
int Amax;
bool viz[305][305];
int coada[2][1000005], st, dr;
int dx[] = {-1,0,1,0},dy[]={0,1,0,-1};

bool posib(int W) {
    memset(viz,0,sizeof(viz));
    if (a[x1][Y1] < W) {
            return 0;
    }

    coada[0][st=dr=1] = x1;
    coada[1][st] = Y1;
    viz[x1][Y1] = 1;
    int i;
    while (st <= dr) {
        x = coada[0][st];
        y = coada[1][st]; st++;
        for (i = 0; i < 4; i++) {
            xx = x+dx[i];
            yy = y+dy[i];
            if (xx < 1 || xx > n || yy < 1 || yy > n) continue;
            if (a[xx][yy] >= W) {
                if (xx==x2 && yy==y2) return 1;
            }

            if (viz[xx][yy] == 0 && a[xx][yy] >= W) {
                if (xx==x2 && yy==y2) return 1;
                viz[xx][yy] = 1;
                coada[0][++dr] = xx;
                coada[1][dr] = yy;
            }
        }
    }

    return 0;
}

int main() {
    f >> n >> m;
    for (i = 1; i<= n;i++)
        for (j = 1; j <= n; j++)
            f >> a[i][j], Amax = max(Amax,a[i][j]);

    for (int w = 1; w <= m; w++) {
        f >> x1 >> Y1 >> x2 >> y2;

        int p = 1;
        while (p < Amax) p *= 2;
        j = 0;
        for(;p;p/=2) {
            if (j + p <= Amax) {
                if (posib(j+p))
                    j+=p;
            }
        }

        g << j << '\n';
    }
}