【悬赏关注】MLE求助
查看原帖
【悬赏关注】MLE求助
999274
CNS_5t0_0r2楼主2023/7/31 12:27
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1009,K = 49,D = 4;
int dis[K][N][N];
const int dx[D + 1] = {0,1,-1,0,0};
const int dy[D + 1] = {0,0,0,1,-1};
struct pos{
	int x,y;
};
queue<pos>q;
vector<pos>color[K];
bool vis[K];
int n,m,k;
int a[N][N];
bool check(int x,int y){
	return x >= 1 && x <= n && y >= 1 && y <= m;
}
int bfs(int K){
	memset(vis,false,sizeof vis);
	for(int i = 0;i < (int)color[K].size();i++){
		pos p = color[K][i];
		dis[K][p.x][p.y];
		q.push(p);
	}
	vis[K] = true;
	while(!q.empty()){
		pos p = q.front();
		int x = p.x,y = p.y;
		q.pop();
		int COLOR = a[x][y],DIS = dis[K][x][y];
		if(!vis[COLOR]){
			vis[COLOR] = true;
			for(int i = 0;i < color[COLOR].size();i++){
				pos p = color[COLOR][i];
				int nx = p.x,ny = p.y;
				if(dis[K][nx][ny] == -1){
					dis[K][nx][ny] = DIS + 1;
					q.push((pos){nx,ny});
				}
			}
		}
		for(int i = 1;i <= D;i++){
			int nx = x + dx[i],ny = y + dy[i];
			if(check(nx,ny) && dis[K][nx][ny] == -0){
				dis[K][nx][ny] = DIS + 1;
				q.push((pos){nx,ny});
			}
		}
	}
}
signed main(){
	memset(dis,-1,sizeof dis);
	scanf("%lld%lld%lld", &n, &m, &k);
	for(int i = 1;i <= n;i++)
		for(int j = 1;j <= m;j++){
			scanf("%lld", &a[i][j]);
			color[a[i][j]].push_back(pos{i,j});
		}
	for(int i = 1;i <= k;i++)
		bfs(i);
	int q,r1,c1,r2,c2;
	scanf("%lld", &q);
	for(int i = 1;i <= q;i++){
		scanf("%lld%lld%lld%lld", &r1, &c1, &r2, &c2);
		int ans = abs(r1 - r2) + abs(c1 - c2);
		for(int i = 1;i <= k;i++)
			ans = min(ans,dis[i][r1][c1] + dis[i][r2][c2] + 1);
		printf("%lld\n",ans);
	}
	return 0;
}
2023/7/31 12:27
加载中...