Pagini recente » Cod sursa (job #90536) | Cod sursa (job #671707) | Cod sursa (job #1917902) | Cod sursa (job #50577) | Cod sursa (job #920551)
Cod sursa(job #920551)
// Include
#include <fstream>
#include <cstring>
#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);
}