原题地址:823. 排列 - AcWing题库
题目描述:
给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
数据范围
1 ≤ n ≤ 9
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
实现过程:
利用深度优先搜素算法遍历元素,并且按字典序输出;
字典序:字典排序(lexicographical order)是一种对于随机变量形成序列的排序方法。即按照字母顺序,或者数字小大顺序,由小到大的形成序列。例如此题中,“123”与“132”按字典序排列,从左往右依次相比,第一位都相同,比较下一位,“2”小于“3”,故先输出"123"。
DFS(深度优先搜素算法):
1.DFS会按照树的深度来遍历,选一条路一直走到底,回溯,遍历所有的子节点,进而达到全局搜索的目的。在此题中,当n个元素都被遍历完,回溯,继续遍历子节点并输出。
核心:
参数设置:变化的数据为参数,如上,设置一数组来表示每一条分支路,判断每个分支点是否使用过,再设置此时遍历的元素。
恢复现场:当一支路遍历完成之后,要回溯到最近的分支点继续判断,若不恢复现场,会误以为此点已被遍历过。
代码实现:
#include<iostream>
using namespace std;
const int N=10;
int n;
void dfs(int u,int nums[],bool st[])
{
if(u > n)
{
for(int i = 1 ; i <= n ; i ++) printf("%d ",nums[i]);
puts(" ");
}
else
{
for(int i = 1 ; i <= n ; i ++)
{
if(st[i] == 0)
{
st[i] = true;
nums[u] = i;
dfs(u + 1,nums,st);
st[i] = false;//恢复现场
}
}
}
}
int main()
{
scanf("%d",&n);
int nums[N];
bool st[N]={0};
dfs(1,nums,st);
return 0;
}