zju 2100 Seeding(dfs暴搜)

该博客探讨了如何使用深度优先搜索(DFS)解决浙江大学2100题Seeding。博主指出,这个问题实际上是在判断给定的图是否为半欧拉图。他们提到,一个图是欧拉图当且仅当它是连通的且所有顶点的度数为偶数,而半欧拉图则满足是连通的且只有两个顶点的度数为奇数。虽然理论上可以用并查集来检查连通性以简化解决方案,但博主因为懒惰选择使用DFS,并提供了相应的DFS代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感觉这题就像是在判断给你的这个图是不是半欧拉图,

判断图G是欧拉图当且仅当G为连通图,且所有点度为偶数。

判断图G是半欧拉图当且仅当G为连通图,且当且仅当2个点度数为奇数。

欧拉图也是半欧拉图。

但是,从里理论上来说,可以做出来,还要用并查集判断是否连接,感觉繁了点,不过,时间应该要比DFS的少,速度要快。

但是由于本来很懒,很懒,所以只是提出建议,可以这样做,自己做了一下,感觉可以,就不做了。

附上DFS代码:

#include<iostream>
#include<cstring>
using namespace std;

#define MAX_N 10

char map[MAX_N][MAX_N];
bool use[MAX_N][MAX_N],succeed;
int n,m,numstones,numseed;

void Init(){

	memset(map,'S',sizeof(map));
	memset(use,false,sizeof(use));

	numstones=0;
	succeed=false;

	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			cin>>map[i][j];
			if(map[i][j]=='S')
				numstones++;
		}
	numseed=n*m-numstones;
}
bool dfs(int x,int y,int k){	
	
	if(map[x][y]=='S' || use[x][y])
		return false;
	use[x][y]=true;

	if(succeed || k==1 || dfs(x+1,y,k-1)||
		dfs(x-1,y,k-1)||dfs(x,y+1,k-1)||dfs(x,y-1,k-1)){
		succeed=true;
		return true;
	}
	use[x][y]=false;
	return false;
}
int main(){
	while(cin>>n>>m && n&& m){
		Init();	
		dfs(1,1,numseed)?cout<<"YES"<<endl:cout<<"NO"<<endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值