递归实现排列型枚举(acwing)

题目描述:

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

输入格式:

一个整数 n。

输出格式:

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

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

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

数据范围:

1≤n≤9

输入样例:

3

输出样例:

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

分析步骤:

  第一:理清思路:

  1. 我们这道题还是DFS去求解,但是这道题目要我们求解的是排列型枚举,所以和组合型不一样。大家要明白组合和排列的区别。我们求解DFS有两种方法,一种是枚举位置;一种是枚举数字。本题采用枚举位置的方法,因为这个更简单跟容易理解。

  2. 枚举位置,我们先枚举第一个位置他有三种选择1,2,3这样我们就可以像一颗树一样去画出来,在第一个位置上选择1的情况下还有两个位置,所以我们可以分别选择2,3,再分别选择1,2;1,3的情况下再选择那个没有选择过的。就形成123,132的情况。之后的情况大家可以动手画画。

  第二:书写主函数,构建整体框架:

  1.  输入值,进入DFS这个1代表我们已经遍历到了第几个位置。书写DFS我们一定要明白,自己对于变量的定义是什么,只有明白了我们在之后的递归中才不会迷失。

int main()
{cin>>n;dfs(1);return 0;
}

  第三:书写DFS函数:

  1. 我们一般写DFS先确定结束的条件。我们这道题因为是枚举位置,所以我们x>n的时候就代表着我们合理的位置都已经有了数字不能等于n,因为当x==n时我们正要选择最后一个位置的数,还没完,最终所以我们就按照之前存储的顺序输出出来就可以。

  2. 如果x<=n的时候就代表还没结束,我们就用for循环去遍历,看看哪个数还没有被选择过,没有被选择过的话就将这个数选择进入数组,更改一下状态,再进入下一次的递归搜索,搜索完之后就得返回恢复现场。像这道题目就一定得恢复现场,因为如果不恢复现场那么123被选择过之后状态就只会是true,之后就不能排序列出其他的顺序了。

void dfs(int x){if(x > n){for(int i = 1; i <= n ; i ++){cout<<path[i]<<" ";} cout<<endl;}else{for(int i = 1 ; i <= n ; i ++){if(!st[i]){st[i] = true;path[x] = i;dfs(x+1);st[i] = false;path[x] = 0;}} }
}

代码:

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 20;int  n ; 
int path[N];
bool st[N];void dfs(int x){if(x > n ){for(int i = 1; i <= n ; i ++){cout<<path[i]<<" ";} cout<<endl;}else{for(int i = 1 ; i <= n ; i ++){if(!st[i]){st[i] = true;path[x] = i;dfs(x+1);st[i] = false;path[x] = 0;}} }
}int main()
{cin>>n;dfs(1);return 0;
}

注意:递归实现排列型枚举;递归实现组合型枚举;递归实现指数型枚举。这三道题目代表了DFS三大标准题型,学会这三道模板题目才有可能继续去学习更难的DFS。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/596185.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在同一个局域网如何共享打印机和文件

1.在连接了打印机的主机上设置 1.1启用windows共享 打开网络与共享中心&#xff0c;点击“更改高级共享设置” 选择&#xff1a; “启用网络发现”“启用文件和打印机共享”“启用共享以便可以访问网络的用户可以读取和写入公用文件夹中的文件” 打开控制面板&#xff0c;选…

使用idea 调试HashMap时出现ExpiringCache

问题背景&#xff1a; 调试HashMap源码验证是在第一次put才创建table时&#xff0c;发现刚new出来HashMap表的size已经有值了&#xff1f;&#xff01;&#xff01;而且都是关于ExpiringCache之类的 解决办法&#xff1a; 开启调试前只在main方法里打断点&#xff0c;程序启动…

防抖节流面试

1、防抖 1.1、条件 1、高频 2、耗时&#xff08;比如console不算&#xff09; 3、以最后一次调用为准 刷到个神评论&#xff0c;回城是防抖&#xff0c;技能cd是节流 1.2、手写 传参版本 function debounce(fn,delay){let timerreturn function(...args){//返回函数必须是普…

之前翻硬币问题胡思乱想的完善

题目背景 小明正在玩一个“翻硬币”的游戏。 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面&#xff0c;用 o 表示反面&#xff08;是小写字母&#xff0c;不是零&#xff09;&#xff0c;比如可能情形是 **oo***oooo&#xff0c;如果同时翻转左边的两个硬币&#x…

秋招刷题4(动态规划)

1.购物单 import java.util.Scanner;public class Main {public static void main(String[] args){Scanner sc new Scanner(System.in);int N sc.nextInt();int m sc.nextInt();Goods[] goods new Goods[m];for(int i 0; i < m; i){goods[i] new Goods();}for(int i …

【cpp】快速排序优化

标题&#xff1a;【cpp】快速排序 水墨不写bug 正文开始&#xff1a; 快速排序的局限性&#xff1a; 虽然快速排序是一种高效的排序算法&#xff0c;但也存在一些局限性&#xff1a; 最坏情况下的时间复杂度&#xff1a;如果选择的基准元素不合适&#xff0c;或者数组中存在大…

ubuntu-server部署hive-part1-安装jdk

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本&#xff1a;ubuntu-server-22.04.3 虚拟机&#xff1a;virtualbox7.0 安装jdk 上传解压 以root用户&#xff0c;将jdk上传至/opt目录下 tar zxvf jdk-8u271-linux-x64.tar.gz 配置环境变量…

YOLOv5实战记录05 Pyside6可视化界面

个人打卡&#xff0c;慎看。 指路大佬&#xff1a;【手把手带你实战YOLOv5-入门篇】YOLOv5 Pyside6可视化界面_哔哩哔哩_bilibili 零、虚拟环境迁移路径后pip报错解决 yolov5-master文件夹我换位置后&#xff0c;无法pip install了。解决如下&#xff1a; activate.bat中修改…

RabbitMQ3.13.x之七_RabbitMQ消息队列模型

RabbitMQ3.13.x之七_RabbitMQ消息队列模型 文章目录 RabbitMQ3.13.x之七_RabbitMQ消息队列模型1. RabbitMQ消息队列模型1. 简单队列2. Work Queues(工作队列)3. Publish/Subscribe(发布/订阅)4. Routing(路由)5. Topics(主题)6. RPC(远程过程调用)7. Publisher Confirms(发布者…

代码随想录算法训练营Day46|LC139 单词拆分

一句话总结&#xff1a;完全背包&#xff01; 原题链接&#xff1a;139 单词拆分 动态规划之完全背包五部曲&#xff1a; 确定dp数组与下标含义&#xff1a;表示字符串长度为i时&#xff0c;dp[i] true 的话&#xff0c;可以拆分为一个或多个在字典中出现的单词。确定递归公…

Ruoyi-vue-pro Vue + nginx 二级目录部署到云服务器

http://www.your-server.com/ 这是一级目录&#xff0c;由于项目多&#xff0c;一般会通过二级域名http://oa.your-server.com/或二级目录http://www.your-server.com/oa来发布&#xff0c;本篇记录一下二级目录发布。先看效果 1、router/index.js配置base export default new …

人工智能研究生前置知识—jupyter notebook快速上手使用

jupyter notebook快速上手使用 前置说明 使用的前置要求安装了anaconda的环境 特点&#xff1a;以代码块和单元块为基础&#xff0c;可以嵌入Markdown格式的说明文字 通知可以嵌入魔法函数&#xff0c;并导出为指定的格式 格式.ipynb&#xff09;&#xff08;不仅仅可以运行py…