acwing<94. 递归实现排列型枚举>

简介: 每日打卡

image.png

还是使递归的方法,根据题意我们要输出n个数的随机排列的全部情况,思路就有所不同,若当前有n个空位,便有n个选择,随空位的减少可供使用的数字也随之减少,于是我们需要两个数组,一个负责表示当前空位填入的数值,另一个则负责表示当前数字是否被使用过,之后不断深入与回溯,便可达到目的。


#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10;
int n,count;
int sta[N];
bool used[N];
void dfs(int i)
{
    if(i>n)  //i>n时递归结束
    {
        for(int j = 1;j<=n;j++) printf("%d ",sta[j]); //输出空格对应的数字
        puts("");
        return;
    }
    for(int j = 1;j<=n;j++)
    {
        if(!used[j])  //判断该数字没被使用过,否则继续查找
        {
            sta[i] = j;  //当前位置变为该数字
            used[j] = true; //表示当前数字已使用
            dfs(i+1);   //选择下一位置的数字
            used[j] = false;  //重置使用
        }
    }
}
int main()
{
    scanf("%d",&n);
    dfs(1);
    return 0;
}

image.gif

目录
相关文章
|
6月前
|
索引
【每日一题Day131】LC1144递减元素使数组呈锯齿状 | 贪心+枚举
【每日一题Day131】LC1144递减元素使数组呈锯齿状 | 贪心+枚举
45 0
|
6月前
【每日一题Day155】LC1630等差子数组 | 枚举+排序
【每日一题Day155】LC1630等差子数组 | 枚举+排序
40 0
|
5月前
|
移动开发 C++
【洛谷 P1157】组合的输出 题解(深度优先搜索+枚举子集)
该问题要求编程输出从1到n中选择r个元素的所有组合,组合按字典序排列。输入包含两自然数n和r(1&lt;n&lt;21, 0≤r≤n)。输出每个组合时,每个数字占据3个字符宽度。提供的AC代码使用C++,通过递归搜索方法枚举子集。样例输入为5 3,输出显示所有3个元素的组合。
45 0
|
6月前
|
人工智能 测试技术
【位运算 状态压缩 枚举子集】1178. 猜字谜
【位运算 状态压缩 枚举子集】1178. 猜字谜
|
6月前
|
存储 算法 测试技术
位运算、状态压缩、枚举子集汇总
位运算、状态压缩、枚举子集汇总
|
C语言
C语言:杨氏矩阵中查找某数(时间复杂度小于O(N))
题目: 有一个数字矩阵(二维数组), 矩阵的每行从左到右是递增的, 矩阵从上到下是递增的, 请编写程序在这样的矩阵中查找某个数字是否存在, 要求:时间复杂度小于O(N)。
261 1
|
6月前
|
C语言
二分查找法的区间判断【C语言】
二分查找法的区间判断【C语言】
|
11月前
递归实现排列型枚举
递归实现排列型枚举
|
6月前
|
存储 算法 Java
【算法训练-数组 二】【元素组合】两数之和、三数之和
【算法训练-数组 二】【元素组合】两数之和、三数之和
52 0
|
11月前
|
算法 测试技术 C#
C++二分查找算法:132 模式解法二枚举2
C++二分查找算法:132 模式解法二枚举2