【递归与递推 1】AcWing94.递归实现排列型枚举

简介: 【递归与递推 1】AcWing94.递归实现排列型枚举

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

输入格式

一个整数 n 。

输出格式

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

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

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

数据范围

1 ≤ n ≤ 9

输入样例:

3

输出样例:

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

思路

用dfs深度优先搜索来做,以给的例子为例,先划出三个位置,然后对于第一个位置,可填的数有1、2、3,也就有三个分支,然后再去每个分支进行第二个位置的填数,然后是第三个。


这里注意:数只能用一次,所以就需要对于数字进行标记是否用过。


对于字典序最小,实际上只要按照顺序来做就行了

#include<iostream>
#include<cstdio>
using namespace std;
const int N = 10;
//这里注意全局数组会自动赋值为0、false
int n;
bool used[N];   //用没用过
int state[N];   //表示放的是哪个数,0:还没放
void dfs(int u)
{
    //先判断边界
    if(u > n) 
    {   //直接打印方案
        for(int i = 1 ; i <= n ; i ++) printf("%d ", state[i]);
        puts("");   //puts表示输出“字符串+换行”
    }
    for(int i = 1; i <= n; i ++)
        if(!used[i]) // 如果i没有用过
        {
            state[u] = i;
            used[i] = true;
            dfs(u + 1);
            //恢复现场
            state[u] = 0;
            used[i] = false;
        }
}
int main()
{
    cin >> n;
    dfs(1); //从哪个数字开始搜索
    return 0;
}
相关文章
|
5月前
|
移动开发 C++
【洛谷 P1157】组合的输出 题解(深度优先搜索+枚举子集)
该问题要求编程输出从1到n中选择r个元素的所有组合,组合按字典序排列。输入包含两自然数n和r(1&lt;n&lt;21, 0≤r≤n)。输出每个组合时,每个数字占据3个字符宽度。提供的AC代码使用C++,通过递归搜索方法枚举子集。样例输入为5 3,输出显示所有3个元素的组合。
49 0
|
6月前
|
算法
简记二分算法模板与代码案例:整数二分和浮点数二分
本文介绍了两种算法模板,分别是整数二分和浮点数二分。
53 0
|
11月前
|
算法 测试技术 C#
C++二分查找算法:132 模式解法二枚举2
C++二分查找算法:132 模式解法二枚举2
|
存储 Java C++
力扣题目-两数相加(迭代递归,常用3种语言实现)
力扣题目-两数相加(迭代递归,常用3种语言实现)
118 0
|
算法 C++
快排例题——第k个数
做道简单一点的题巩固一下
|
机器学习/深度学习 算法 C++
(C/C++)STL函数(3)二分算法题以及二分模板 和(蓝桥杯)递推与递归题目及解法(ACwing)
(C/C++)STL函数(3)二分算法题以及二分模板 和(蓝桥杯)递推与递归题目及解法(ACwing)
(C/C++)STL函数(3)二分算法题以及二分模板 和(蓝桥杯)递推与递归题目及解法(ACwing)
【递归与递推 2】AcWing92. 递归实现指数型枚举
【递归与递推 2】AcWing92. 递归实现指数型枚举