题目描述
题目链接:www.acwing.com/problem/con…
思路解析
这是一道经典的递归问题,我们可以从1开始,从第一位开始选择,画一颗递归搜索树,如图所示:
根据递归搜索树的每条选择路径,我们可以看到每一个次序的选择流程,但要用代码实现,我们还需要定义两个数组,一个用来记录
当前的路径,另一个用来记录当前的数是否已经被选择过:
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;
}
运行结果:
这道题的介绍到这里就结束了,如果你觉得本篇文章对你多少有些帮助,可以点个赞或者收藏一波支持一下哦,欢迎各位大佬批评指正,咱们下一道题再见!