Cod sursa(job #1153178)

Utilizator ovidiu95Decean Ovidiu Ciprian ovidiu95 Data 25 martie 2014 12:06:35
Problema Matrice 2 Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#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;
}