Cod sursa(job #525738)

Utilizator cristiprgPrigoana Cristian cristiprg Data 26 ianuarie 2011 01:08:40
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <queue>
using namespace std;
#define DIM 301
#define mp make_pair

const int vi[] = {-1, 0, 1, 0}, vj[]={0, 1, 0, -1};
int a[DIM][DIM], q, n, hmax, hmin = 1<<30;

inline int max(const int &a, const int &b)
{
	return a<b?b:a;
}

inline int min(const int &a, const int &b)
{
	return a<b?a:b;
}


bool lee(int is, int js, int ig, int jg,  int h)
{
	if (a[is][js] < h)
		return false;
	
	queue<pair<int, int> >Q;
	Q.push(mp(is, js));
	while (!Q.empty())
	{
		int i = Q.front().first, j = Q.front().second;
		Q.pop();
		for (int d = 0; d < 4; ++d)
		{
			int im = i + vi[d], jm = j + vj[d];
			if (im < 1 || im > n || jm < 1 || jm > n) continue;
			if (a[im][jm] < h) continue;
			if (im == ig && jm == jg)
			{
				while (!Q.empty())
					Q.pop();
				
				return true;
			}
			Q.push(mp(im, jm));
			
		}
	}
	
	return false;
}

void solve()
{
	FILE *f = fopen("matrice.in", "r"), *out = fopen("matrice.out", "w");
	fscanf(f, "%d%d", &n, &q);
	for (int i = 1;i <= n; ++i)
		for (int j = 1; j <= n; ++j)
			fscanf(f, "%d", &a[i][j]), hmax = max(hmax, a[i][j]), hmin = min(hmin, a[i][j]);
	
	for (int i1, i2, j1, j2;q;--q)
	{
		fscanf(f, "%d%d%d%d", &i1, &j1, &i2, &j2);
		for (int h = hmax; h >= hmin; --h)
			if(lee(i1, j1, i2, j2, h))
			{
				fprintf(out, "%d\n", h);
				break;
			}
	}
	fclose(f);
	fclose(out);
	
}

int main()
{
	solve();
	return 0;
}