栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

dfs深度优先搜索算法相关三类问题与解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

dfs深度优先搜索算法相关三类问题与解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
  • 什么是dfs算法
  • 一、Fibonacci数列问题
  • 二、八皇后问题+数独问题(简略版)


什么是dfs算法

提示:这里可以添加本文要记录的大概内容:

深度优先搜索算法(Depth First Search,简称DFS):⼀种⽤于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可
能深的搜索树的分⽀。当节点v的所在边都⼰被探寻过或者在搜寻时结点不满⾜条件,搜索将回溯到发现节点v的那条边的起始节点。
整个进程反复进⾏直到所有节点都被访问为⽌。属于盲⽬搜索,最糟糕的情况算法时间复杂度为O(!n)。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Fibonacci数列问题
//开胃小菜
#include
using namespace std;
int fib(int n)
{
	if(n==1 || n==2) return 1;
	int m=fib(n-1)+fib(n-2);
	return m;
}
int main()
{
	int n;
	scanf("%d",&n);
	printf("%dn",fib(n));
	return 0;
}
二、八皇后问题+数独问题(简略版)

在作者另一篇文章中有针对java语言的更为一般的八皇后问题解法

#include
using namespace std;
#define N 15 
int ans[N],cnt=0,n,lie[N],dui[105],du[2*N],fl=0;
void work()
{
	cnt++;
	if(cnt>3) return;
	for(int i=1;i<=n;++i) printf("%d ",ans[i]);
	printf("n");
}
int get(int x)
{
	if(x<0) return x+100;
	return x;
}
void dfs(int now)
{
	if(now==n+1) {   work(); return; }
	for(int i=1;i<=n;++i)
	if( !lie[i] && !dui[get(now-i)] && !du[now+i]){
		lie[i]=1; dui[get(now-i)]=1; du[now+i]=1;
		ans[now]=i;
		//printf("now:%d i:%dn",now,i);
		dfs(now+1);
		ans[now]=0;
		lie[i]=0; dui[get(now-i)]=0; du[now+i]=0;
	}
}
int main()
{
	scanf("%d",&n);
	dfs(1);
	printf("%dn",cnt);
}


//数独问题(简略版)


#include
using namespace std;
#define N 15
int ans[N][N],ge[N][N],shu[N][N],he[N][N],a[N][N];
void work()
{
	for(int i=1;i<=9;++i){
		for(int j=1;j<=9;++j)
	  	printf("%d ",ans[i][j]);
	  	cout<
	if(i==9 && j==10) { work(); return ;}
	if(j==10)  { dfs(i+1,1); return ; }
	if(ans[i][j]) { dfs(i,j+1); return ; }
	for(int ii=1;ii<=9;ii++)
	if(!he[i][ii] && !shu[j][ii] && !ge[(i-1)/3*3+(j-1)/3+1][ii]){
		he[i][ii]=1, shu[j][ii]=1, ge[(i-1)/3*3+(j-1)/3+1][ii]=1;
		ans[i][j]=ii;
		dfs(i,j+1);
		he[i][ii]=0, shu[j][ii]=0, ge[(i-1)/3*3+(j-1)/3+1][ii]=0;
		ans[i][j]=0;
	}
}
int main()
{
	for(int i=1;i<=9;++i){
		for(int j=1;j<=9;++j){
			scanf("%d",&a[i][j]);
			if(a[i][j])
			he[i][a[i][j]]=1, shu[j][a[i][j]]=1, ge[(i-1)/3*3+(j-1)/3+1][a[i][j]]=1;
			//if(!a[i][j]) fl[0][i]|=(1<<(9-j));
			ans[i][j]=a[i][j];
		}
	}
	dfs(1,1);
	//for(int i=1;i<=9;++i)
	// for(int j=1;j<=9;++j)
	 // if(!a[j][i]) fl[1][i]|=(1<<(9-j));
	 
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/884866.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号