郊游求助!!!!

#include<bits/stdc++.h>
using namespace std;
int n;
int mapx[505][505];
long long res;
bool mapb[505][505];
int walk[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
queue<int> q;
void bfs(int x,int y){
	q.push(x),q.push(y);
	while(!q.empty()){
		int x=q.front();
		q.pop();
		int y=q.front();
		q.pop();
		for(int i=0;i<4;i++){
			int nx=x+walk[i][0],ny=y+walk[i][1];
			if(nx<1||nx>n||ny<1||ny>n||mapb[nx][ny]){
				continue;
			}
			if(mapx[nx][ny]>mapx[ x ][y]+!mapb[ x ][y]){
				q.push(nx);
				q.push(ny);
				mapx[nx][ny]=mapx[ x ][y]+!mapb[ x ][y];
			}
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			mapx[i][j]=min(min(i-1,j-1),min(n-i,n-j));
		}
	}
	for(int i=0;i<(n*n);i++){
		int x;
		cin>>x;
		int y=x%n;
		if(!y){
			y=n;
		}
		res+=mapx[(x+(n-1))/n][y];
		mapb[(x+(n-1))/n][y]=true;
		bfs((x+(n-1))/n,y);
	}
	cout<<res;
	return 0;
}
1 个赞