《算法竞赛进阶指南》-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. 递归实现组合型枚举-题解

《算法竞赛进阶指南》-AcWing-93. 递归实现组合型枚举-题解

算法竞赛进阶指南做题记录