Cod sursa(job #920546)

Utilizator fhandreiAndrei Hareza fhandrei Data 20 martie 2013 15:40:47
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
// Include
#include <fstream>
#include <vector>
using namespace std;

// Definitii
#define pb push_back
#define mp make_pair

#define type_coord pair<int, int>
#define x first
#define y second

// Constante
const int sz = 301;

// Functii
int coordToNode(type_coord pos);
int bs(int left, int right);
void dfs(int node, int limit);

// Variabile
ifstream in("matrice2.in");
ofstream out("matrice2.out");

int num, questions;
int maxValue;

int cost[sz*sz];
bool visited[sz*sz];

vector<int> graph[sz*sz];

type_coord start, stop;
int startNode, stopNode;

// Main
int main()
{
	in >> num >> questions;
	
	for(int i=1 ; i<=num ; ++i)
	{
		for(int j=1 ; j<=num ; ++j)
		{
			in >> cost[coordToNode(mp(i, j))];
			maxValue = max(maxValue, cost[coordToNode(mp(i, j))]);
			
			if(i != 1) // Sus
				graph[coordToNode(mp(i, j))].pb(coordToNode(mp(i-1, j)));
			
			if(i != num) // Jos
				graph[coordToNode(mp(i, j))].pb(coordToNode(mp(i+1, j)));
			
			if(j != 1) // Stanga
				graph[coordToNode(mp(i, j))].pb(coordToNode(mp(i, j-1)));
			
			if(j != num) // Dreapta
				graph[coordToNode(mp(i, j))].pb(coordToNode(mp(i, j+1)));
		}
	}
	
	while(questions--)
	{
		in >> start.x >> start.y;
		in >> stop.x >> stop.y;
		
		startNode = coordToNode(start);
		stopNode = coordToNode(stop);
		
		out << bs(1, min(cost[startNode], cost[stopNode])) << '\n';
	}
	
	in.close();
	out.close();
	return 0;
}

int coordToNode(type_coord pos)
{	return (pos.x-1)*num + pos.y;	}

int bs(int left, int right)
{
	int answer = 0;
	
	while(left <= right)
	{
		int mid = (left + right) / 2;
		memset(visited, 0, sizeof(visited));
		dfs(startNode, mid);
		if(visited[stopNode])
		{
			answer = mid;
			left = mid + 1;
		}
		else
			right = mid - 1;
	}
	return answer;
}

void dfs(int node, int limit)
{
	visited[node] = true;
	
	vector<int>::iterator it, end;
	for(it=graph[node].begin(), end=graph[node].end() ; it!=end && !visited[stopNode] ; ++it)
		if(!visited[*it] && limit <= cost[*it])
			dfs(*it, limit);
}