排列数字(DFS深度优先搜索)

给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。

现在,请你按照字典序将所有的排列方法输出。

输入格式

共一行,包含一个整数 n。

输出格式

按字典序输出所有排列方案,每个方案占一行。

数据范围

1≤n≤7

输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

思路:

DFS算法每次都往深搜,到达叶子结点后回溯

这道题使用DFS即可做出,因为结合了递归不好理解,先将递归解释:递归就是函数调用自身,遇到终止条件后返回。

借用这篇文章的程序:[AcWing]842. 排列数字(C++实现)dfs模板题,递归思想的解释_Cloudeeeee的博客-CSDN博客 

#include<iostream>
using namespace std;int n;void func(int u){if(u == 0) return;cout << "Recursive program goes to the next level --- " << u << endl;func(u-1);cout << "Recursive program backtracking --- " << u <<endl;return;
}
int main(){cin >> n;func(n);return 0;
}

得到结果:

我们可以得到这样的流程 :

由此我们就理解了递归的流程,下面是DFS对这道题的解法:一个位置一个位置的填入数字,如果没有空位置了就让最后一个填的数字可用并返回

 示例代码:

#include<iostream>
using namespace std;
const int N=10;
int path[N]; //记录位置信息
bool st[N]; //保存这个位置用过了没有,用过就设为true,默认初始为false
int n;
void dfs(int u) //u表示当前填的位置
{if( u == n ) //所有位置都填满了(u现在变成了最后一个位置的下一位),此时输出{for(int i=0;i<n;i++) cout<<path[i]<<" ";cout<<endl;return;}for(int i=1;i<=n;i++)    //枚举当前位置还可以填哪些数{if(!st[i]) //如果这个数字还能用{path[u] = i; //把数字填到当前位置上,i表示从1到n的数字st[i] = true; //记录当前数字已经被使用dfs(u+1); //填下一个位置st[i] = false; //回溯的时候要恢复,这个数字现在可以用} //注意:回溯不仅是return,还有for循环}}
int main()
{cin>>n;dfs(0); //从第0个位置开始看return 0;
}

注意:这个程序里面回溯不仅仅是递归终止的return,还有for循环,比如运行到st[i] = false;的时候整个if语句就结束了,但是可能上面的for循环还没有结束,要再次进行循环操作

    for(int i=1;i<=n;i++)    //枚举当前位置还可以填哪些数{if(!st[i]) //如果这个数字还能用{path[u] = i; //把数字填到当前位置上,i表示从1到n的数字st[i] = true; //记录当前数字已经被使用dfs(u+1); //填下一个位置st[i] = false; //回溯的时候要恢复,这个数字现在可以用} //注意:回溯不仅是return,还有for循环}

这道题光看代码可能不太好理解,所以我把程序运行的流程图画了出来,例如输入3的时候 ,下面的三张图分别代表着dfs(0)情况下,i=1,i=2,i=3的运行流程

 

大家不理解的话也可以在纸上自己写一遍 

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

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

相关文章

非上市公司的财务报表可以找到吗?

企业财务报表 财务报表是反映企业或预算单位一定时期资金、利润状况的会计报表。我国财务报表的种类、格式、编报要求&#xff0c;均由统一的会计制度作出规定&#xff0c;要求企业定期编报。国营工业企业在报告期末应分别编报资金平衡表、专用基金及专用拨款表&#xff0c;基…

LeetCode | 19. 删除链表的倒数第 N 个结点

LeetCode | 19. 删除链表的倒数第 N 个结点 OJ链接 思路&#xff1a; 定义虚拟头节点dummy并初始化使其指向head然后定义快慢指针让快指针先走n步然后一起走最后删除倒数第n个节点然后释放虚拟节点dummy struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {…

洛谷 P4568 [JLOI2011] 飞行路线 pytho解析

P4568 [JLOI2011] 飞行路线 pytho解析 时间&#xff1a;2023.11.20 题目地址&#xff1a;[JLOI2011] 飞行路线 题目分析 对于这个题呢就是最短路的问题了。那就可以用Dijkstra 算法&#xff0c;唯一不同的地方就是有免费的机票次数&#xff0c;那我们就先不考虑这个&#xf…

【C++】标准模板库 STL 简介

&#x1f9d1;‍&#x1f393;个人主页&#xff1a;简 料 &#x1f3c6;所属专栏&#xff1a;C &#x1f3c6;个人社区&#xff1a;越努力越幸运社区 &#x1f3c6;简 介&#xff1a;简料简料&#xff0c;简单有料~在校大学生一枚&#xff0c;专注C/C/GO的干货分…

B站短视频如何去水印?一键解析下载B站视频!

在浏览B站视频时&#xff0c;我们有时会遇到带有水印的场景。这些水印可能会干扰我们对视频内容的观看体验&#xff0c;特别是在全屏观看时。此外&#xff0c;当我们想要保存或分享这些视频时&#xff0c;水印也会成为一种障碍。因此&#xff0c;去除水印的需求就变得非常迫切。…

PXE高效批量网络装机

什么是PXE PXE是由Intel公司开发的最新技术&#xff0c;全称为“Preboot Execution Environment”&#xff08;预启动执行环境&#xff09;&#xff0c;工作于Client/Server的网络模式。它允许工作站通过网络从远端服务器下载映像&#xff0c;并由此支持通过网络启动操作系统。…

机器学习赋予用户“超人”的能力来打开和控制虚拟现实中的工具

原创 | 文 BFT机器人 最近&#xff0c;剑桥的研究人员开发了一种虚拟现实应用程序&#xff0c;只需用户手部的移动即可打开和控制一系列3D建模工具。 来自剑桥大学的研究人员利用机器学习开发了“HotGestures”类似于许多桌面应用程序中使用的热键&#xff08;快捷键&#xff…

fastdfs-client-java-1.30 maven 打包安装

1. 进入源代码目录&#xff0c;打开cmd mvn clean install 或者 mvn package 问题不大的话会在同级目录target目录下生成打包后文件 2. 当前目录下cmd进行maven安装 mvn install:install-file -DgroupIdorg.csource -DartifactIdfastdfs-client-java -Dversion${version} -D…

HTTP(Hypertext Transfer Protocol)协议

文章目录&#xff1a; 什么是HTTP&#xff1f;认识URLurlencode 和 urldecodeHTTP 协议请求和响应格式HTTP 请求&#xff08;Request&#xff09;HTTP 响应&#xff08;Response&#xff09; HTTP 请求方法HTTP 的状态码常见的Header 什么是HTTP&#xff1f; HTTP&#xff08;…

用向量数据库Milvus Cloud搭建GPT大模型+私有知识库的定制AI助手——PPT大纲助手

随着人工智能技术的不断发展,AI助手在各行各业中扮演着越来越重要的角色。在商业领域,PPT演示是一种常见的沟通方式,而定制化的PPT大纲助手能够极大地提高PPT制作效率和质量。本文将介绍如何利用向量数据库Milvus Cloud搭建GPT大模型和私有知识库,构建一款高效的PPT大纲助手…

产品智能化成照明企业“必选题” 小匠物联交出标准答卷

7月20日&#xff0c;由佛山市科学技术局、佛山市工业和信息化局、佛山市科学技术协会指导&#xff0c;佛山市照明灯具协会主办的“2023佛山市智能照明&驱动新技术研讨会”在佛山市国家火炬创新创业园宜尚PLUS酒店隆重举行。此次会议邀请近100位知名企业产品经理和研发工程师…

金蝶云星空ScpSupRegHandler任意文件上传漏洞复现 [附POC]

文章目录 金蝶云星空ScpSupRegHandler任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 金蝶云星空ScpSupRegHandler任意文件上传漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请…

3 个常识点必须先了解!0基础入门Python!

学习一门新的语言之前&#xff0c;首先简单了解下这门语言的背景。Python 是一种面向对象的解释型计算机程序设计语言&#xff0c;由荷兰人 Guido van Rossum 于 1989 年发明&#xff0c;第一个公开发行版发行于 1991 年。 Python 在设计上坚持了清晰划一的风格&#xff0c;这…

Xrdp+内网穿透实现远程访问Linux Kali桌面

XrdpCpolar实现远程访问Linux Kali桌面 文章目录 XrdpCpolar实现远程访问Linux Kali桌面前言1. Kali 安装Xrdp2. 本地远程Kali桌面3. Kali 安装Cpolar 内网穿透4. 配置公网远程地址5. 公网远程Kali桌面连接6. 固定连接公网地址7. 固定地址连接测试 前言 Kali远程桌面的好处在于…

交易机器人-微信群通知

微信公众号:大数据高性能计算 1 背景 背景是基于人工去做交易本身无法做到24小时无时无刻的交易,主要是虚拟币本身它是24小时交易,人无法做到24小时盯盘,其次就是如果你希望通过配置更加复杂的规则甚至需要爬取最新的信息走模型进行量化交易的时候,就需要自己去做一些量化…

竞赛选题 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习行人重识别(person reid)系统 该项目…

在vue-cli中快速使用webpack-bundle-analyzer

webpack-bundle-analyzer 是一个可视化资源分析工具&#xff0c;可以直观地分析打包出的文件有哪些&#xff0c;及它们的大小、占比情况、各文件 Gzip压缩后的大小、模块包含关系、依赖项等。 从vue-cli官方的更新记录可以看到&#xff0c;从vue-cli3开始集成report命令 当前环…

Python 基础之线程池入门

Python 基础之线程池入门 代码示例 import threading import time from concurrent.futures import ThreadPoolExecutor# 创建线程池 threadpool ThreadPoolExecutor(max_workers 20)# 具体执行任务的方法 def test(i):print(">>>>>>>>>>…

设计模式-组合模式-笔记

“数据结构”模式 常常有一些组件在内部具有特定的数据结构&#xff0c;如果让客户程序依赖这些特定数据结构&#xff0c;将极大地破坏组件的复用。这时候&#xff0c;将这些特定数据结构封装在内部&#xff0c;在外部提供统一的接口&#xff0c;来实现与特定数据结构无关的访…

什么是tomcat, tomcat该如何使用?(java)

目录 tomcat是什么? 下载安装 tomcat目录结构 启动服务器 部署静态页面 什么是"静态"? 部署单个HTML页面 部署带有CSS / JavaScript / 图片的HTML 部署html到单独的目录中 部署到云服务器 tomcat是什么? tomcat翻译过来为汤姆猫, 但是他可不是猫和老鼠中的…