Cod sursa(job #580952)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 13 aprilie 2011 17:27:49
Problema Matrice 2 Scor 35
Compilator cpp Status done
Runda pregatire_sibiu Marime 1.64 kb
#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;
}