DFS深度优先搜索算法——个人理解版

#include<iostream>
using namespace std;
//这个题是从1到n的数,有多少种排列方法。可以理解为把1到n这n个数放到a[1]到a[n]中去。
//重点有2个:1、每把一个数放到数组a【】中,就立马标记这个数。用book【i】,i即这个数本身。
//     2、递归:每放好一个数之后要继续放下一个数,即调用函数本身。核心是什么时候返回。(放完所有数返回)
int n,a[101],book[101];//book[]为标记数组,a[]为记载数组,n是总数
void dfs(int step) 
{
	int i;
	if (step> n) {
		for (int j = 1; j <= n;j++) {
			cout << a[j] << " ";	
		}
		cout << endl ;
		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() {
	cin >> n;
	dfs(1);
	system("pause");
	return 0;
}
/*
//上面是一个例子,下面是DFS算法的一般形态;
//搞懂两个return,你就明白了DFS
void M_dfs(int a) {
	if (条件a)//撞到南墙,走到边界,满足条件
	{
		...//执行条件体。
		return;//有了一条完整的到头的路了
	}
	for (i = 1; i < n; i++)//尝试每一种可能
	{
		//函数体1
		//...
		//
		M_dfs(a + 1);//下一步
	}
	return; //本层次走完,回退一步
}*/

推荐《啊哈算法》对初学者挺和善的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值