AcWing94. 递归实现排列型枚举:输出1~n的全排列

这篇具有很好参考价值的文章主要介绍了AcWing94. 递归实现排列型枚举:输出1~n的全排列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

把 1∼ n n n n n n 个整数排成一行后随机打乱顺序,输出所有可能的次序。

输入格式

一个整数 n n n

输出格式

按照从小到大的顺序输出所有方案,每行 1 个。

首先,同一行相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

数据范围

1 ≤ n ≤ 9 1≤n≤9 1n9

输入样例

3

输出样例

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

思路

该问题也被称为全排列问题,所有可能的方案总数是 n ! n! n! 种。在这里,递归需要求解的问题是 “把指定的 n n n 个整数按照任意次序排列”,在每次递归中,尝试把每个可用的数作为数列中的下一个数,求解 “把剩余 n − 1 n-1 n1 个整数按照任意次序排列” 这个规模更小的子问题。文章来源地址https://www.toymoban.com/news/detail-738811.html

代码

#include <cstdio>
using namespace std;

int order[15]; //按顺序依次记录被选择的整数
bool chosen[15]; //标记被选择的整数
int n;

void dfs(int cur) {
    if (cur == n + 1) { //问题边界
        for (int i = 1; i <= n; i++) {
            printf("%d ", order[i]);
        }
        puts("");
        return ;
    }
    
    for (int i = 1; i <= n; i++) {
        if (chosen[i]) continue;
        order[cur] = i;
        chosen[i] = true; //标记i被选择了
        dfs(cur + 1);
        chosen[i] = false; //回溯到上一个问题前,恢复现场
        order[cur] = 0; //本行可以省略,因为每次都会被重新赋值
    }
}

int main() {
    scanf("%d", &n);
    dfs(1);
    return 0;
}

到了这里,关于AcWing94. 递归实现排列型枚举:输出1~n的全排列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包