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

题目

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

输入格式

一个整数 n n n。

输出格式

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

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

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

数据范围

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

输入样例

复制代码
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 n−1 个整数按照任意次序排列" 这个规模更小的子问题。

代码

cpp 复制代码
#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;
}
相关推荐
踩坑记录26 分钟前
leetcode hot100 200. 岛屿数量 medium dfs
leetcode·深度优先
山峰哥4 小时前
SQL调优实战:从索引失效到性能飙升的破局之道
服务器·数据库·sql·性能优化·编辑器·深度优先
重生之后端学习5 小时前
105. 从前序与中序遍历序列构造二叉树
java·数据结构·后端·算法·深度优先
寻寻觅觅☆6 小时前
东华OJ-基础题-131-8皇后·改(C++)
c++·算法·深度优先
闻缺陷则喜何志丹1 天前
【C++DFS 马拉车】3327. 判断 DFS 字符串是否是回文串|2454
c++·算法·深度优先·字符串·力扣·回文·马拉车
码农幻想梦1 天前
3483. 2的幂次方(上海交通大学考研机试题目)
递归·分治
踩坑记录1 天前
leetcode hot100 236.二叉树的最近公共祖先 medium dfs 递归
leetcode·深度优先
重生之后端学习2 天前
114. 二叉树展开为链表
java·数据结构·算法·链表·职场和发展·深度优先
Pluchon2 天前
硅基计划4.0 算法 图的存储&图的深度广度搜索&最小生成树&单源多源最短路径
java·算法·贪心算法·深度优先·动态规划·广度优先·图搜索算法
重生之后端学习3 天前
230. 二叉搜索树中第 K 小的元素
java·数据结构·算法·深度优先