搜索死循环,求助dalao
查看原帖
搜索死循环,求助dalao
873786
wangjiajinself楼主2024/7/9 11:22
#include <iostream>
#include <cstdio>
using namespace std;
int n,m,p[1001][1001],vis[1001][1001];
bool judge(int mid,int xio,int yio){
	cout<<xio<<" "<<yio<<endl;
	if(xio==-1&&yio==-1) {
		for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++) vis[i][j]=0;
		for(int i=1;i<=m;i++)
		if(!judge(mid,n,i)) return false;
		return true;
	}
	else if(p[xio][yio]>mid) return false;
	if(xio==1) return true;
	int a,b,c,d;
	if(xio-1>=1&&xio-1<=n){
		if(yio>=1&&yio<=m&&!vis[xio-1][yio]) {
			vis[xio-1][yio]=1;
		a=judge(mid,xio-1,yio);	
		vis[xio-1][yio]=0;
		}
	}
	if(xio+1>=1&&xio+1<=n){
		if(yio>=1&&yio<=m&&!vis[xio+1][yio]) {
			vis[xio+1][yio]=1;
			c=judge(mid,xio+1,yio);
			vis[xio+1][yio]=0;
		}
	}
	if(xio>=1&&xio<=n){
		if(yio-1>=1&&yio-1<=m) {
			vis[xio][yio-1]=1;
			b=judge(mid,xio,yio-1);
			vis[xio][yio-1]=0;
		}
		if(yio+1>=1&&yio+1<=m) {
			vis[xio][yio+1]=1;
			d=judge(mid,xio,yio+1);
			vis[xio][yio+1]=0;
		}
	}
	//x-1,y x,y-1 x,y+1 x+1,y
	if((!a)&&(!b)&&(!c)&&(!d)) return false;
}
int main()
{
	cin>>n>>m;
	int iMax=-0x7fffffff;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++){
		cin>>p[i][j];
		iMax=max(p[i][j],iMax);
	}
	judge(3,-1,-1);
	int l=0,r=iMax,mid,ans;
	while(l<=r){
		mid=(l+r)>>1;
		if(judge(mid,-1,-1)) {
			l=mid+1;
			ans=mid;
		}
		else r=mid-1;
	}
	cout<<ans;
	return 0;
}
2024/7/9 11:22
加载中...