递归实现排列型枚举

178 阅读2分钟

题目描述

image.png

题目链接www.acwing.com/problem/con…


思路解析

这是一道经典的递归问题,我们可以从1开始,从第一位开始选择,画一颗递归搜索树,如图所示:

image.png 根据递归搜索树的每条选择路径,我们可以看到每一个次序的选择流程,但要用代码实现,我们还需要定义两个数组,一个用来记录当前的路径,另一个用来记录当前的数是否已经被选择过

int path[N];
// 用来记录当前的选择路径
// 值表示选择的数,下标表示位数
// 例如path[2]=3,表示第二位选择的数为3

bool st[N];
// 用下标表示选择的数,同时用下标对应的值表示当前的值是否被选择过
// false表示未被选择,true表示已被选择
// 例如st[2]=false,表示2还未被选择过
// 注:C++的bool类型数组默认值为false

下方是代码实现↓

代码实现

#include<iostream>
using namespace std;

const int N = 10;

int n;
bool st[N];// 默认为false
int path[N];

// u:位数
// path:记录当前的路径
// st:记录哪些数已经被用过了,false表示没用过,true表示用过

void dfs(int u)
{
	if (u > n)
	{
		// 输出此时的排列方案
		for (int i = 1; i <= n; i++)
			cout << path[i] << " ";
		cout << endl;
		return;
	}

	// 每一轮循环表示选择的值的变化
	for (int i = 1; i <= n; i++)
	{
		if (st[i] == false)
		{
			path[u] = i;// 表示在该条路径下,第u位选择的数为i
			st[i] = true;// 表示i已经选了
			dfs(u + 1);// 进行下一位数的选择
			st[i] = false;// 恢复现场
		}
	}
}

int main()
{
	cin >> n;
	dfs(1);// 从第一位开始

	return 0;
}

运行结果:

image.png


这道题的介绍到这里就结束了,如果你觉得本篇文章对你多少有些帮助,可以点个赞或者收藏一波支持一下哦,欢迎各位大佬批评指正,咱们下一道题再见!