85分求调玄关
查看原帖
85分求调玄关
512724
wl2009_pretty_girl楼主2024/7/12 16:33
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int, int>
#define fi first
#define se second
#define mkp make_pair
const int N = 35, M = 4505, INF = 0x3f3f3f3f;
int n, m, q, a[N][N], dis[N][N], vis[N][N];
int dis1[M], vis1[M];
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, -1, 0, 1};//r l u d
vector<pii> v[M], g[M];
int id(int x, int y, int z) {
	return 5 * ((m - 1) * x + y) + z;
}
void add(vector<pii> &v, int y, int w) {
	v.push_back(mkp(y, w));
}
void init() {
	for (int i = 0; i < M; i++) {
		g[i].clear();
		for (pii x : v[i])
			g[i].push_back(x);
	}
}
bool check(int x, int y) {
	if (x < 1 || x > n || y < 1 || y > m) return false;
	if (!a[x][y]) return false;
	return true;
}
void BFS(int sx, int sy, int xx, int yy) {
	memset(dis, 0x3f, sizeof(dis));
	memset(vis, 0, sizeof(vis));
	queue<pii> q;
	dis[sx][sy] = 0, vis[sx][sy] = 1; 
	vis[xx][yy] = 1;
	q.push(mkp(sx, sy));
	while (!q.empty()) {
		int x = q.front().fi, y = q.front().se;
		q.pop();
		for (int i = 0; i < 4; i++) {
			int tx = x + dx[i], ty = y + dy[i];
			if (!check(tx, ty) || vis[tx][ty]) continue;
			vis[tx][ty] = 1, dis[tx][ty] = dis[x][y] + 1;
			q.push(mkp(tx, ty));
		}
	}
}
void add_edge(int sx, int sy, int k) {
	int tx = sx + dx[k], ty = sy + dy[k];
	if (check(tx, ty)) add(v[id(sx, sy, k)], id(tx, ty, k ^ 2), 1);
	for (int i = 0; i < 4; i++) {
		int x = sx + dx[i], y = sy + dy[i];
		if (!check(x, y) || i == k) continue;
		add(v[id(sx, sy, k)], id(sx, sy, i), dis[x][y]);
	}
}
void SPFA(int s) {
	memset(dis1, 0x3f, sizeof(dis1));
	memset(vis1, 0, sizeof(vis1));
	queue<int> q;
	dis1[s] = 0, vis1[s] = 1;
	q.push(s);
	while (!q.empty()) {
		int x = q.front();
		q.pop();
		vis1[x] = 0;
		for (pii i : g[x]) {
			int y = i.fi, w = i.se;
			if (dis1[x] + w < dis1[y]) {
				dis1[y] = dis1[x] + w;
				if (!vis1[y]) {
					vis1[y] = 1;
					q.push(y);
				}
			}
		}
	}
}
int main() {
	cin >> n >> m >> q;
	for (int i = 1; i <= n; i++) 
		for (int j = 1; j <= m; j++)
			cin >> a[i][j];
	//BFS(1, 1, 3);
	//add_edge(2, 1, 1);
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (!a[i][j]) continue;
			for (int k = 0; k < 4; k++) {
				int x = i + dx[k], y = j + dy[k];
				if (!check(x, y)) continue;
				BFS(x, y, i, j), add_edge(i, j, k);
			}
		} 	
	}
	while (q--) {
		int ex, ey, sx, sy, tx, ty;
		cin >> ex >> ey >> sx >> sy >> tx >> ty;
		init(), BFS(ex, ey, sx, sy);
		for (int i = 0; i < 4; i++) {
			int x = sx + dx[i], y = sy + dy[i];
			if (!check(x, y)) continue;
			add(g[id(ex, ey, 4)], id(sx, sy, i), dis[x][y]);
		}
		SPFA(id(ex, ey, 4));
	//	cout << dis1[id(2, 1, 3)] << endl;
		int ans = INF;
		for (int i = 0; i < 4; i++) {
			int x = tx + dx[i], y = ty + dy[i];
			if (!check(x, y)) continue;
			ans = min(ans, dis1[id(tx, ty, i)]);
		}
		cout << (ans == INF ? -1 : ans) << '\n';
	}
	return 0;
}
2024/7/12 16:33
加载中...