AcWing 823. 排列
原题链接
简单
作者:
wdwwdw
,
2025-01-17 13:51:49
,
所有人可见
,
阅读 1
#include <iostream>
using namespace std;
int n;
//一次dfs函数调用只会得出某个排列的某一位的结果
//u表示本次dfs函数寻找的是某个排列的第u位的结果
//nums存放一个排列的各位结果,nums[i]表示一个排列中第i位是数字nums[i]
//布尔数组st记录了某个排列的第1位到第u-1位已经使用过的数字,确保dfs得出的排列的第u位数字与前面的数字各不相同
//对于某次dfs的调用可以肯定的是:排列的第1位到第u-1位已经确定好了,那么本次dfs需要确定第u位,并且把中间结果
//传递给下一层dfs让其确定第u + 1位的结果,因此这是一个递归算法
void dfs(int u, int nums[], bool st[])
{
//可以肯定递归终止条件为u = n + 1,意味着排列的第1位到第n位已经确定了,即已经搜索出了一个排列结果
//按要求输出结果即可
if (u > n)
{
for (int i = 1; i <= n; i ++)
{
cout << nums[i] << " ";
}
cout << endl;
}
//递归未终止,那么本次dfs需要确定第u位的数字
else
{
//第u位的数字需要同时满足两个条件
//1. 区间[1, n]内的正整数
//2.未出现在nums[1]~nums[u - 1]中
//for循环保证了第u位数字满足条件1,st数组保证第u位数字满足条件2
for (int i = 1; i <= n; i ++)
{
if(!st[i])
{
nums[u] = i;
st[i] = true;
//让下一层dfs确定第u + 1位的结果
dfs(u + 1, nums, st);
//在本次for循环时,尝试让第u位为i,
//同理下一轮循环时,尝试让第u位为i + 1,
//那么第u位为i + 1时,数字i是未被使用过的数字
//因此在进入下一轮循环前,重新标记数字i未被使用
st[i] = false;
}
}
}
}
int main()
{
cin >> n;
int nums[n + 1];
bool st[n + 1] = {0};
dfs(1, nums, st);
return 0;
}