本文已参与「新人创作礼」活动,一起开启掘金创作之路。
@TOC
递归实现排列型枚举
问题描述
升序输出所有的全排列
样例输入
3
样例输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
解题思路
类似递归实现指数型枚举和递归实现组合型枚举,cal函数的退出条件是x>n。
我们用一个数组记录所选排列的顺序(每个数选择的是什么),用一个布尔数组来表示某个数是否选择过。
每次在所有没选过的数中选择一个,递归在剩下的数中选择一个...,递归回来后恢复现场,取消选择这个数。
#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define fi(i, l, r) for (int i = l; i < r; i++)
#define cd(a) scanf("%d", &a)
typedef long long ll;
vector<int>v;
int n,m;
void prt()
{
for(int i=0;i<v.size();i++)
printf("%d ",v[i]);
puts("");
}
void calu(int x)
{
if(x>n)return x==n+1&&v.size()==m?prt():void();
if(v.size()>m||v.size()+(n-x+1)<m)return;
calu(x+1);
v.push_back(x);
calu(x+1);
v.pop_back();
}
int main()
{
cin>>n>>m;
calu(1);
return 0;
}
同步发文于我的CSDN,原创不易,转载请附上原文链接哦~
Tisfy:letmefly.blog.csdn.net/article/det…