求助,DFS WA 30分
查看原帖
求助,DFS WA 30分
432183
JoeBiden2020楼主2021/12/15 13:59
#include<bits/stdc++.h>
using namespace std;
int a[501][501],n,ans=0,lim,minx,miny,minn=INT_MAX,maxn=INT_MIN;
bool vis[501][501];
void dfs(int x,int y){
	if(x<0||y<0||x>n||y>n||vis[x][y])return;
	vis[x][y]=1;
	if(abs(a[x][y]-a[x+1][y])<=lim)dfs(x+1,y);
	if(abs(a[x][y]-a[x-1][y])<=lim)dfs(x-1,y);
	if(abs(a[x][y]-a[x][y+1])<=lim)dfs(x,y+1);
	if(abs(a[x][y]-a[x][y-1])<=lim)dfs(x,y-1);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
			if(a[i][j]<minn){
				minn=a[i][j];minx=i;miny=j;
			}
			maxn=max(maxn,a[i][j]);
		}
	}
	int l=minn,r=maxn;
	while(l!=r){
		memset(vis,0,sizeof(vis));
		ans=0;
		lim=(l+r)/2;
		dfs(minx,miny);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(vis[i][j])ans++;
			}
		}
	//	cout<<ans<<" "<<l<<" "<<r<<endl;
		if(ans>n*n/2){
			r=lim;
		}
		else{
			l=lim+1;
		}
	}
	cout<<lim;
}
2021/12/15 13:59
加载中...