Pagini recente » Cod sursa (job #470852) | Cod sursa (job #1756872) | Cod sursa (job #1620856) | Cod sursa (job #1927425) | Cod sursa (job #1153178)
#include <fstream>
using namespace std;
#define MAXN 310
#define MAXX 90010
#define MAXL 4
const int dirx[MAXL] = {-1, 0, 1, 0};
const int diry[MAXL] = {0, 1, 0, -1};
int N, Q, L, Sol;
int A[MAXN][MAXN], U[MAXN][MAXN];
int SX[MAXX], SY[MAXX];
int BFS(int X1, int Y1, int X2, int Y2, int H)
{
int i, j, cx, cy;
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++) U[i][j] = 0;
L = 1;
SX[L] = X1, SY[L] = Y1;
U[X1][Y1] = 1;
for (i = 1; i <= L; i++)
for (j = 0; j < MAXL; j++)
{
cx = SX[i] + dirx[j];
cy = SY[i] + diry[j];
if (cx > 0 && cy > 0 && cx <= N && cy <= N && !U[cx][cy] && A[cx][cy] >= H)
{
L++;
SX[L] = cx;
SY[L] = cy;
U[cx][cy] = 1;
if (cx == X2 && cy == Y2) return 1;
}
}
return 0;
}
int main()
{
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
int i, j, X1, Y1, X2, Y2;
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 >> X1 >> Y1 >> X2 >> Y2;
int front = 1, middle, back = A[X1][Y1];
Sol = 0;
while (front <= back)
{
middle = (front + back) / 2;
if (BFS(X1, Y1, X2, Y2, middle))
{
front = middle + 1;
Sol = middle;
}
else back = middle - 1;
}
fout << Sol << endl;
}
return 0;
}