题目描述:
【蓝桥杯|蓝桥杯——1.2递归实现排列型枚举】
文章图片
AC代码
#include
#include using namespace std;
int n;
const int N = 10;
int path[N];
bool st[N];
void dfs(int u)
{
if (u == n + 1)// 递归终止的条件
{
for (int i = 1;
i <= n;
i ++)
cout << path[i] << " ";
cout << endl;
}for (int i = 1;
i <= n;
i ++)// 遍历每一个数字
{
if (!st[i])// 如果这个数字没有被用过
{
// 选择这个数字
path[u] = i;
st[i] = 1;
dfs(u + 1);
// 恢复现场
path[u] = 0;
st[i] = 0;
//不选,不选的情况下,应该是不执行任何操作
//dfs(u + 1);
}
}
}int main()
{
cin >> n;
/*
如果只是看题干的话,好像有n棵树,但是
由于下一棵树和上一棵树有联系,因此,我
们还是选择使用一棵树。而对于与上一棵树
的联系,我们选择使用一个数组来进行标记
一个数是否被用过
*/dfs(1);
// 我们仍然选择从1开始return 0;
}
推荐阅读
- 蓝桥杯|蓝桥杯——1.5递归实现组合型枚举
- 蓝桥杯——算法训练——数字三角形
- 蓝桥杯|蓝桥杯-新枚举方法应用
- C++|【C++】实现简单的计算功能
- Codeforces|Fault-tolerant Network(连通块/贪心)
- 算法|Fractal解题笔记
- leetcode刷题记录|移动零——LeetCode283题
- leetcode刷题记录|两数之和II - 输入有序数组——LC167题(中等难度)
- leetcode刷题记录|轮转数组——LeetCode198题