《算法竞赛进阶指南》-AcWing-94. 递归实现排列型枚举-题解
Posted Tisfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法竞赛进阶指南》-AcWing-94. 递归实现排列型枚举-题解相关的知识,希望对你有一定的参考价值。
递归实现排列型枚举
问题描述
升序输出所有 n n n的全排列 ( 0 < n < 10 ) (0< n<10) (0<n<10)
样例输入
3
样例输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
解题思路
类似递归实现指数型枚举和递归实现组合型枚举,cal函数的退出条件是x>n。
我们用一个数组 o r d e r order order记录所选排列的顺序(每个数选择的是什么),用一个布尔数组 c h o s e n chosen chosen来表示某个数是否选择过。
每次在所有没选过的数中选择一个,递归在剩下的数中选择一个…,递归回来后恢复现场,取消选择这个数。
#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;
}
原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/119255055
以上是关于《算法竞赛进阶指南》-AcWing-94. 递归实现排列型枚举-题解的主要内容,如果未能解决你的问题,请参考以下文章
《算法竞赛进阶指南》-AcWing-92. 递归实现指数型-题解
《算法竞赛进阶指南》-AcWing-92. 递归实现指数型-题解
《算法竞赛进阶指南》-AcWing-93. 递归实现组合型枚举-题解