48分
查看原帖
48分
1052857
zer20101226楼主2024/7/26 11:01
#include<bits/stdc++.h>
using namespace std;
int n,m,r,x,len,y,ans=1e8,vis[300][300],sum,a[1000][1000],b[500][500];
int dx[10]={0,0,0,1,1,1,-1,-1,-1};
int dy[10]={0,1,-1,1,0,-1,1,0,-1}; 
char c;
map<int,int>q;
int p[2510];
void dfs(int x,int y,int l,int r){
	if(x==0||y==0||x>n||y>n||vis[x][y]==1||a[x][y]<p[l]||a[x][y]>p[r]) return;
	vis[x][y]=1;
	if(b[x][y]==1) sum++; 
	for(int i=0;i<8;i++){
		int x1=x+dx[i],y1=y+dy[i];
		dfs(x1,y1,l,r);
	} 
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>c;
			if(c=='P') x=i,y=j;
			else if(c=='K'){
				b[i][j]=1;
				len++;
			}
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
			if(q[a[i][j]]==0){
				p[++m]=a[i][j];
				q[a[i][j]]=1;
			}
		}
	sort(p+1,p+m+1);
	r=1;
	for(int l=1;l<=m;l++){
		sum=0;
		if(r<m){
			while(r<=m&&sum!=len){
				sum=0;	
				if(p[l]>a[x][y]){
					cout<<ans;
					return 0;
				}
				else if(p[r]<a[x][y]){
					r++;
					continue;
				}
				dfs(x,y,l,r);memset(vis,0,sizeof(vis));
				if(sum==len){
					ans=min(ans,p[r]-p[l]);
				}
				else r++;
			}
		}
		else{
			while(sum!=len){
				sum=0;	
				if(p[l]>a[x][y]){
					cout<<ans;
					return 0;
				}
				dfs(x,y,l,r);memset(vis,0,sizeof(vis));
				if(sum==len){
					ans=min(ans,p[r]-p[l]);
				}
				else{
					cout<<ans;
					return 0;
				}
			}
		}
	}
	cout<<ans;
	return 0;
}
2024/7/26 11:01
加载中...