Cod sursa(job #2083450)

Utilizator valorosu_300Cristian Gherman valorosu_300 Data 7 decembrie 2017 18:55:15
Problema Matrice 2 Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
using namespace std;
ifstream in("matrice2.in");
ofstream out("matrice2.out");
const int N = 301, dx[] = {-1,0,1,0}, dy[] = {0,1,0,-1};
int mat[N][N], xf, yf;
short int cx[N*N], cy[N*N];
bool s[N][N];
bool bun(int i, int j, int n){
    return (i >= 1 && j >= 1 && i <= n && j <= n);
}
void sterg(int n){
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            s[i][j] = false;
}
bool bfs(int xi, int yi, int val, int n){
    if(mat[xi][yi] < val)
        return false;
    int st = 1, dr = 1, k,xc,yc,x,y;
    cx[st] = xi;
    cy[st] = yi;
    sterg(n);
    s[xi][yi] = true;
    while(st <= dr){
        x = cx[st];
        y = cy[st];
        st++;
        for(k=0;k<4;k++){
            xc = x + dx[k];
            yc = y + dy[k];
            if(bun(xc,yc,n) && s[xc][yc] == false && mat[xc][yc] >= val){
                s[xc][yc] = true;
                cx[++dr] = xc;
                cy[dr] = yc;
            }
        }
    }
    return (s[xf][yf] == true);
}
void solve(int xi, int yi, int n){
    int i,step, Max = mat[xf][yf];
    for(step=1;step < Max;step <<= 1);
    for(i=0;step;step >>= 1)
        if(bfs(xi,yi, i + step, n))
            i += step;
    out<<i<<"\n";
}
int main()
{
    int n,q,xi,yi;
    in>>n>>q;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            in>>mat[i][j];
    for(int i=1;i<=q;i++){
        in>>xi>>yi>>xf>>yf;
        solve(xi,yi,n);
    }
    out.close();
    return 0;
}