Pagini recente » Cod sursa (job #1204869) | Cod sursa (job #1860596) | Cod sursa (job #950802) | Cod sursa (job #195470) | Cod sursa (job #1146993)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#define INF ~(1<<31) - 100
using namespace std;
int n, T;
int a[310][310];
int mat[310][310];
struct cord{int x, y; cord(int x = 0, int y = 0):x(x), y(y){}};
struct cmp
{
bool operator()(cord A, cord B)
{
return a[A.x][A.y] < a[B.x][B.y];
}
};
cord start, fin;
priority_queue<cord, vector<cord>, cmp> q;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};
void citire()
{
scanf("%d%d", &n, &T);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d", &mat[i][j]);
for(int i = 0; i <= n; i++)
a[0][i] = a[i][0] = a[i][n+1] = a[n+1][i] = INF;
}
void reset()
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
a[i][j] = 0;
while(!q.empty())
q.pop();
a[start.x][start.y] = mat[start.x][start.y];
q.push(start);
}
void debug()
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
cerr << a[i][j] << '\t';
cerr<<endl;
}
cerr<<endl;
}
void solve()
{
reset();
cord crt;
int x, y;
while(!q.empty())
{
crt = q.top();
q.pop();
if(crt.x == fin.x && crt.y == fin.y)
{
// debug();
return;
}
for(int i = 0; i < 4; i++)
{
x = crt.x+dx[i];
y = crt.y+dy[i];
if(min(a[crt.x][crt.y], mat[x][y]) > a[x][y])
{
a[x][y] = min(a[crt.x][crt.y], mat[x][y]);
q.push(cord(x, y));
}
}
}
}
int main()
{
freopen("matrice2.in", "r", stdin);
freopen("matrice2.out", "w", stdout);
citire();
while(T--)
{
scanf("%d%d%d%d", &start.x, &start.y, &fin.x, &fin.y);
solve();
printf("%d\n", a[fin.x][fin.y]);
}
return 0;
}