《算法竞赛进阶指南》-AcWing-94. 递归实现排列型枚举-题解

80 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

@TOC

递归实现排列型枚举

传送门

问题描述

升序输出所有nn的全排列(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。

我们用一个数组orderorder记录所选排列的顺序(每个数选择的是什么),用一个布尔数组chosenchosen来表示某个数是否选择过。

每次在所有没选过的数中选择一个,递归在剩下的数中选择一个...,递归回来后恢复现场,取消选择这个数。

#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…