深度优先算法

  • 深度优先算法是一种搜索算法,在已知空间中,搜索出所有可能的结果,for循环也可以达到同样的效果,但是它的时间的复杂度远高于深度优先算法。
  • 深度优先算法的核心是递归操作,其思想为:解决当下该如何做,至于下一步该如何做,与当下相同。
  1. 下面我们来看一个实例,一个数的全排列。暴力解法直接使用嵌套使用for循环,这里当然是使用深度优先来解决啊。
#include<stdio.h>
int a[10],book[10],n; //a数组是记录排列顺序,book数组记录那些数已经排列过了。

void dfs(int step)    //当前排第几个数
{
	int i;
	if(step == n+1)    //判断是否已经排完
	{	
		for(i=1;i<=n;i++)
			printf("%d",a[i]);
		printf("\n");
		return ;
	}
	for(i=1;i<=n;i++)   //递归排序。
	{
		if(book[i]==0)
		{
			a[step] = i;
			book[i] = 1;    //标记那些数已经排序过了。
			dfs(step+1);
			book[i] = 0;    //取消已经标记过的数字。
		}
	}
	return ;
}
int main(void)
{
	scanf_s("%d",&n);    //多少个数的全排列
	dfs(1);
	return 0}

2.下面再来看看第二个例子,三位数的加法(其和也是三位数)的所有可能。其思想与核心代码与上面的基本相同,只是当下要做的事情不同而已。


  1	 #include<stdio.h>
  2 
  3 
  4 int a[51],book[51];
  5 
  6 void dfs(int step)
  7 {
  8      int i;
  9      if(step==10)
 10      {
 11           if((a[1]*100+a[2]*10+a[3])+(a[4]*100+a[5]*10+a[6])==(a[7]*100+a[8    ]*10+a[9]))
 12           { printf("%d%d%d+%d%d%d=%d%d%d",a[1],a[2],a[3],a[4],a[5],a[6],a[7    ],a[8],a[9]);
 13           printf("\n");
 14           }
 15           return;
 16      }
 17 
 18      for(i=1;i<=9;i++)
 19      {
 20           a[step] = i;
 21           book[step] = 1;
 22           dfs(step+1);
 23           book[step];
 24      }
 25 }
 26 
 27 int main(void)
 28 {
 29      dfs(1);
 30      return 0;
 31 }

看了上面两个例子,我们应该对深度优先算法有了一定的了解,其核心是递归操作,下一步的操作与当前的操作一样,但要记住:递归递归,归去来兮。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值