Pagini recente » Cod sursa (job #180456) | Cod sursa (job #2910398) | Cod sursa (job #1137508) | Cod sursa (job #2974821) | Cod sursa (job #580952)
Cod sursa(job #580952)
#include <iostream>
#include <fstream>
using namespace std;
const char iname[] = "matrice2.in";
const char oname[] = "matrice2.out";
const int nmax = 102;
ifstream fin(iname);
ofstream fout(oname);
int i, n, q, A[nmax][nmax], sol;
int middle, st, dr;
int xinit, yinit, xfin, yfin, j;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
int qx[nmax * nmax];
int qy[nmax * nmax];
int viz[nmax][nmax], xnou, ynou;
int lee(int xst, int yst, int xfn, int yfn, int minimum_value)
{
int i;
memset(viz, 0, sizeof(viz));
memset(qx, 0, sizeof(qx));
memset(qy, 0, sizeof(qy));
int back = 1, front = 0;
qx[back] = xst;
qy[back] = yst;
viz[xst][yst] = 1;
if(A[xst][yst] < minimum_value)
return 0;
while(front <= back)
{
++front;
xnou = qx[front];
ynou = qy[front];
for(i = 0; i <= 3; i ++)
{
xnou = qx[front];
ynou = qy[front];
xnou = xnou + dx[i];
ynou = ynou + dy[i];
if(viz[xnou][ynou] == 0 && xnou > 0 && xnou <= n && ynou > 0 && ynou <= n && A[xnou][ynou] >= minimum_value)
{
viz[xnou][ynou] = 1;
qx[++back] = xnou;
qy[back] = ynou;
if(xnou == xfn && ynou == yfn)
return 1;
}
}
}
return 0;
}
int main()
{
fin >> n >> q;
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
fin >> A[i][j];
for(i = 1; i <= q; i ++)
{
fin >> xinit >> yinit >> xfin >> yfin;
sol = 0;
st = 1, dr = 1000000;
while(st < dr)
{
middle = (st + dr) >> 1;
if(lee(xinit, yinit, xfin, yfin, middle))
{
st = middle + 1;
sol = middle;
}
else
dr = middle;
}
fout << sol << "\n";
}
return 0;
}