DFS基础例题(全排列)

#include<iostream>
using namespace std;
int n;
int book[10] = {0};
int a[10];
 
void dfs(int index)
{
	if(index == n)  //递归终止条件
	{
		for(int i = 0;i < n;i++)
		    cout << a[i];
	    cout <<endl; 
	    return ;
	}
	
	else
	{
		for(int i = 1;i <= n;++i)
		{
			if(!book[i])
			{
				book[i] = 1;//标记位
				a[index] = i;//把符合的数字保存到数组中
				dfs(index+1);
				a[index] = 0;
				book[i] = 0;//还原标记,以便回溯
			}
		}
	}
}
 
void init()
{
    for(int i = 0;i < 9;++i)
	    book[i] = 0;	
}
 
int main()
{
	
	while(cin >> n)	
	{
		dfs(0);
		init();
	}
	  
	return 0;
}

代码来自:Windsearcher的博客_WindSearcher_CSDN博客

此段代码通过DFS实现全排列

我们可以代入数据去走一遍dfs 便于理解dfs的递归与回溯

如:键入数值2

n=2

主函数进入dfs(0);

进入dfs函数 首先判断的就是是否到终点(这是我们去看代码的顺序)

index=0;

所以没有到终点

进入for循环

i=1

book[1]=1;//表示第一个数被访问了

a[0]=1;//把符合的数字保存在数组中

dfs(index+1);//往更深处搜索

        这层搜索index=1;

        因为book[1]=1;

        所以i=2时才能进入if语句块

        book[2]=1;//表示第二个数被访问了

        a[1]=2;

        dfs(index+1);//进入更深处搜索

                这层搜索index=2;

                输出所排列的数

                return;//回溯到上一个dfs

        这层继续执行未执行的语句

        a[1]=0;

        book[2]=0;

执行完了又回溯上一层

a[0]=0;

book[1]=0;

i=2;

book[2]=1;//标记2被访问了;

a[0]=2;

dfs(index+1=1);

        进入更深层搜索

        i=1时入if语句块

        book[1]=1;//标记1被访问了

        a[1]=1;

        dfs(index+1=2)

                进入更深层搜索

                index=2;

                输出数据

                return回溯上层;

        a[1]=0;

        book[1]=0;

执行结束回溯上层

a[0]=0;

book[2]=0;

在for循环里 循环结束++i

i=3 已不满足循环条件 退出for循环 退出函数

这就是整个思路

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值