分析
排列型枚举的意思是在范围内有多少种不同的排列方法,我们可以想一下组合型枚举,
组合型枚举相当于寻找元素个数为n的子集并且以升序的形式输出。所以同一种组合只
有一种表达形式,那么排列型枚举相当于将同一种组合以不同的排列顺序表现出来。
我们首先看一下组合型枚举的递归函数。
//我们逐行来进行分析
void dfs(int cur)
{
if(cur == m + 1) {
for(int i = 1; i <= m; ++i) cout << arr[i] << " ";//将元素组合输出
puts("");
return ;//返回上一次递归
}
for(int i = 1; i <= n; ++i) {
if(vis[i] || i < arr[cur - 1]) continue;//判断语句i < arr[cur - 1]查看组合是否按照升序进行
//判断语句vis[i]查看组合里的元素是否重合。
arr[cur] = i; //选第i个数
vis[i] = true;
dfs(cur + 1);
vis[i] = false; //恢复
}
}
而排列型枚举不要求升序排列(也不可能要求升序排列,升序排列只有一种情况)所以我们不需
要i < arr[cur - 1]这条判断语句,但是防止重复需要vis[i]语句。而且输出个数也要改变,
只需改成n即可。
代码
#include <bits/stdc++.h>
using namespace std;
int n;
int arr[30];
bool vis[30];
void dfs(int cur)
{
if(cur == n + 1) {
for(int i = 1; i <= n; ++i) cout << arr[i] << " ";
puts("");
return;
}
for(int i = 1; i <= n; ++i) {
if(vis[i]) continue;
arr[cur] = i;
vis[i] = true;
dfs(cur + 1);
vis[i] = false;
}
}
int main()
{
cin >> n;
dfs(1);
return 0;
}