正如标题
50分求解
#include <bits/stdc++.h>
using namespace std;
#define ri register int
#define int long long
const int N = 1251, M = 251;
map<int, int> dis;
map<int, int> mp;
int n, m, t;
int a[M], b[M], z[M][M], yu[M][M], f[M * M], vis[M][M], cnt;
int nxt[5][N * N], to[5][N * N], val[5][N * N], re[5][N * N];
int head[5][M * M], awa[5] = {1, 1, 1, 1, 1};
int zx[5] = {0, 0, 0, 1, -1}, zy[5] = {0, 1, -1, 0, 0};
struct A
{
int x, y, x2, y2, val;
};
struct B
{
int x, y;
} d[N];
inline int read()
{
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
void write(int x)
{
if (x > 9)
write(x / 10);
putchar(x % 10 ^ 48);
}
bool check(int x, int y)
{
if (x >= 1 && x <= n && y >= 1 && y <= n && (!z[x][y]))
return true;
else
return false;
}
int g(int x, int y)
{
return x * n + y;
}
int get(int x, int y)
{
return f[x * n + y];
}
void edgeadd(int u, int v, int w)
{
to[w][awa[w]] = v;
nxt[w][awa[w]] = head[w][u];
re[w][awa[w]] = w;
head[w][u] = awa[w]++;
}
int faq(int x, int y)
{
int qwq = 1e6;
return x * qwq + y;
}
void bfs()
{
queue<A> q;
for (ri i = 1; i <= n; i++)
{
for (ri j = 1; j <= n; j++)
{
if (!yu[i][j])
continue;
q.push((A){i, j, i, j, 0});
dis[faq(get(i, j), get(i, j))] = 1;
}
}
while (q.size())
{
A p = q.front();
q.pop();
for (ri k = 1; k <= 4; k++)
{
for (ri i = head[k][get(p.x, p.y)]; i; i = nxt[k][i])
{
for (ri j = head[k][get(p.x2, p.y2)]; j; j = nxt[k][j])
{
int v1 = to[k][i];
int v2 = to[k][j];
if (v1 == get(p.x, p.y) && v2 == get(p.x2, p.y2))
continue;
if (dis[faq(v1, v2)] > dis[faq(get(p.x, p.y), get(p.x2, p.y2))] + 1 || dis[faq(v1, v2)] == 0)
{
dis[faq(v1, v2)] = dis[faq(get(p.x, p.y), get(p.x2, p.y2))] + 1;
int x = d[v1].x;
int y = d[v1].y;
int x2 = d[v2].x;
int y2 = d[v2].y;
q.push((A){x, y, x2, y2, p.val + 1});
}
}
}
}
}
}
int find(int k)
{
int f;
if (zx[k] == 0)
{
if (zy[k] == 1)
f = 2;
else
f = 1;
}
else if (zy[k] == 0)
{
if (zx[k] == 1)
f = 4;
else
f = 3;
}
return f;
}
signed main(void)
{
n = read();
m = read();
t = read();
for (ri i = 1; i <= m; i++)
{
a[i] = read();
b[i] = read();
z[a[i]][b[i]] = 1;
}
for (ri i = 1; i <= n; i++)
{
if (check(1, i))
yu[1][i] = 1;
if (check(n, i))
yu[n][i] = 1;
if (check(i, 1))
yu[i][1] = 1;
if (check(i, n))
yu[i][n] = 1;
}
for (ri i = 1; i <= m; i++)
{
for (ri k = 1; k <= 4; k++)
{
int x = a[i] + zx[k];
int y = b[i] + zy[k];
if (check(x, y))
yu[x][y] = 1;
}
}
for (ri i = 1; i <= n; i++)
{
for (ri j = 1; j <= n; j++)
f[g(i, j)] = ++cnt, d[cnt] = (B){i, j};
}
for (ri i = 1; i <= n; i++)
{
for (ri j = 1; j <= n; j++)
{
for (ri k = 1; k <= 4; k++)
{
if (!yu[i][j])
continue;
int fp = find(k);
int x = i;
int y = j;
while (check(x, y))
{
x += zx[k];
y += zy[k];
}
x -= zx[k];
y -= zy[k];
edgeadd(get(x, y), get(i, j), fp);
}
}
}
bfs();
while (t--)
{
int r = read();
int c = read();
int r2 = read();
int c2 = read();
int ans = 1e9 + 7;
if (r2 == r && c2 == c)
{
printf("0\n");
continue;
}
for (ri i = 1; i <= 4; i++)
{
int x = r;
int y = c;
int x2 = r2;
int y2 = c2;
while (check(x, y))
{
x += zx[i];
y += zy[i];
}
while (check(x2, y2))
{
x2 += zx[i];
y2 += zy[i];
}
x -= zx[i];
y -= zy[i];
x2 -= zx[i];
y2 -= zy[i];
if (dis[faq(get(x, y), get(x2, y2))] != 0)
ans = min(ans, dis[faq(get(x, y), get(x2, y2))]);
}
if (ans != 1e9 + 7)
printf("%lld\n", ans);
else
printf("-1\n");
}
return 0;
}