算法基础集训(第29天)------>DFS之排列数【DFS入门级算法,初学者必会】

news2024/11/15 8:45:52

一:概念定义

该题对于排列数的定义是对给定的数字n,将从1~n的数字进行全排列并输出

二:题目描述

给定一个整数 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

三:思路分析

运算图例如图:

思路分析:

假设有 3 个空位,从前往后填数字,每次填一个位置,填的数字不能和前面一样。

最开始的时候,三个空位都是空的:__ __ __

首先填写第一个空位,第一个空位可以填 1,填写后为:1 __ __

填好第一个空位,填第二个空位,第二个空位可以填 2,填写后为:1 2 __

填好第二个空位,填第三个空位,第三个空位可以填 3,填写后为: 1 2 3

此时,空位填完,无法继续填数,所以这可以是一种方案,输出。

然后往后退一步,退到了状态:1 2 __ 。剩余第三个空位没有填数。第三个空位上除了填过的 3 ,没有其他数字可以填。

因此再往后退一步,退到了状态:1 __ __。第二个空位上除了填过的 2,还可以填 3。第二个空位上填写 3,填写后为:1 3 __

填好第二个空位,填第三个空位,第三个空位可以填 2,填写后为: 1 3 2

此时,空位填完,无法继续填数,所以这是一种方案,输出。

然后往后退一步,退到了状态:1 3 __ 。剩余第三个空位没有填数。第三个空位上除了填过的 2,没有其他数字可以填。

因此再往后退一步,退到了状态:1 __ __。第二个空位上除了填过的 2,3,没有其他数字可以填。

因此再往后退一步,退到了状态:__ __ __。第一个空位上除了填过的 1,还可以填 2。第一个空位上填写 2,填写后为:2 __ __

填好第一个空位,填第二个空位,第二个空位可以填 1,填写后为:2 1 __

填好第二个空位,填第三个空位,第三个空位可以填 3,填写后为:2 1 3

此时,空位填完,无法继续填数,所以这是一种方案,输出。

然后往后退一步,退到了状态:2 1 __ 。剩余第三个空位没有填数。第三个空位上除了填过的 3,没有其他数字可以填。

因此再往后退一步,退到了状态:2 __ __。第二个空位上除了填过的 1,还可以填 3。第二个空位上填写 3,填写后为:2 3 __

填好第二个空位,填第三个空位,第三个空位可以填 1,填写后为:2 3 1

此时,空位填完,无法继续填数,所以这是一种方案,输出。

然后往后退一步,退到了状态:2 3 __ 。剩余第三个空位没有填数。第三个空位上除了填过的 1,没有其他数字可以填。

因此再往后退一步,退到了状态:2 __ __。第二个空位上除了填过的 1,3,没有其他数字可以填。

因此再往后退一步,退到了状态:__ __ __。第一个空位上除了填过的 1,2,还可以填 3。第一个空位上填写 3,填写后为:3 __ __

填好第一个空位,填第二个空位,第二个空位可以填 1,填写后为:3 1 __

填好第二个空位,填第三个空位,第三个空位可以填 2,填写后为:3 1 2

此时,空位填完,无法继续填数,所以这是一种方案,输出。

然后往后退一步,退到了状态:3 1 __ 。剩余第三个空位没有填数。第三个空位上除了填过的 2,没有其他数字可以填。

因此再往后退一步,退到了状态:3 __ __。第二个空位上除了填过的 1,还可以填 2。第二个空位上填写 2,填写后为:3 2 __

填好第二个空位,填第三个空位,第三个空位可以填 1,填写后为:3 2 1

此时,空位填完,无法继续填数,所以这是一种方案,输出。

然后往后退一步,退到了状态:3 2 __ 。剩余第三个空位没有填数。第三个空位上除了填过的 1,2,没有其他数字可以填。

因此再往后退一步,退到了状态:3 __ __。第二个空位上除了填过的 1,2,没有其他数字可以填。

因此再往后退一步,退到了状态:__ __ __。第一个空位上除了填过的 1,2,3,没有其他数字可以填。

此时深度优先搜索结束,输出了所有的方案。


四:万年无误代码模板(含解析)

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=10;
int n;
int path[N];//一路走来的数字来个记录
bool st[N];//st是statement(声明、状态)的缩写,说明当前已经使用的数字
void dfs(int u)
    {//此处的u可以理解为现在已经操作了的位数
    if(u==n){//我已经实现的位数达到了n位,那么就可以根据path按序输出当前数字了
        for(int i=0;i<n;i++){
            printf("%d ",path[i]);
        }
        puts("");
        return;
    }
    for(int i=1;i<=n;i++){//走到这一步说明path还没有排满,此处循环是在找有没有数字还没有用过的
        if(!st[i]){//如果该数字没有用过
            path[u]=i;//将这个没有用过的数字拿来操作(入坑)
            //由于数组的特性,从0开始,那么应该填入第u位
            st[i]=true;//标明此数字已经使用过
            dfs(u+1);//已经操作了u位,下面需要操作第u+1位
            st[i]=false;//由于需要回溯,所以要恢复现场
        }
    }
}
int main(){
    cin>>n;//输入需要跑的位数
    dfs(0);//已经操作了0位
    return 0;
}
创作不易,建议 点赞+收藏+关注,以免找不到宝贝文章了。
基础集训结束后将开展 拔高系列

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

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

相关文章

Java——只出现一次的数字(2)

题目链接 leetcode在线oj题——只出现一次的数字(2) 题目描述 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且不使用额外空间来解…

Python对liunx中mysql数据库进行双表查询 10个案例带你了解

关于Python连接liunx中mysql数据库的方式在这一篇文章 这里写目录标题1.在Liunx服务器中的mysql新建一个表2.插入数据3.连接liunx中的mysql数据库1、查询1946班的成绩信息2&#xff0c;查询1944班&#xff0c;语文成绩大于60小于90的成绩信息3&#xff0c;查询学生表中1到6行的…

阿里国际站用户增长技术探索与实践

作者&#xff1a;阿里国际站用户增长团队 和众多传统行业一样&#xff0c;跨境贸易产业近年来也经历了数字化的转型创新&#xff0c;而首先参与进模式创新的地方主要集中于信息展示和业务撮合领域。本文将为大家分享阿里国际站在用户增长技术体系建设上的探索与实践。 一、跨境…

SpringBoot超大文件上传(总结)

SpringBoot超大文件上传&#xff0c;秒传&#xff01;分片上传!断电续传&#xff01;&#xff08;总结&#xff09;一. 秒传1、什么是秒传2、本文实现的秒传核心逻辑二. 分片上传1、什么是分片上传2、分片上传的场景三. 断点续传1、什么是断点续传2、应用场景3、实现断点续传的…

【ESP32 WiFi篇(六)】ESP32 WebSocket

文章目录1. WebSocket 概述2. WebSocket 的通信原理和机制3. WebSocket 与 HTTP 的关系3.1 相同点3.2 不同点3.3 关系4. WebSocket 技术出现之前&#xff0c;Web端实现即时通讯的方法有哪些&#xff1f;5. HTTP 存在的问题6. WebSocket 的特点7. WebSocket 数据帧格式1. WebSoc…

简单局域网网络故障排查和处置

简单局域网网络故障排查和处置一、了解基本网络构成1. IP传输通信图2.有线网络&#xff08;一&#xff09;物理层面&#xff08;1&#xff09;网线&#xff08;2&#xff09;网线的制作&#xff08;3&#xff09;网卡接口&#xff08;4&#xff09;光纤&#xff08;5&#xff0…

【图像配准】使用OpenCV进行多图配准拼接

本篇主要利用OpenCV自带的配准拼接函数Stitcher_create来实现多幅图像的配准拼接 代码参考自&#xff1a;https://github.com/samggggflynn/image-stitching-opencv 图像拼接创建步骤 通常来说&#xff0c;根据多个图像创建全景图的步骤为以下几步&#xff1a; 检测两张图像的…

【pytest】三、pytest之setup和teardown,及封装

一、引言&#xff1a; 1&#xff09;setup的作用&#xff1a;用来实现执行前的一些初始化操作(如&#xff1a;数据准备、连接设备、打开APP/浏览器、创建日志对象、创建数据库连接、创建接口的请求对象等操作)&#xff1b; 2&#xff09;teardown的作用&#xff1a;用来实现执…

C++学习/温习笔记:新型源码学编程(二)

写在前面 面向初学者撰写专栏&#xff0c;个人原创的学习C/C笔记&#xff08;干货&#xff09;编程练习所作源代码输出内容为中文&#xff0c;便于理解如有错误之处请各位读者指正请读者评论回复、参与投票&#xff0c;反馈给作者&#xff0c;我会获得持续更新笔记干货的动力。…

放弃内卷,创造新市场

在疫情&#xff0c;突然爆发的俄乌冲突&#xff0c;还有全球的物价上涨情况等社会问题逐渐变得尖锐的动荡中&#xff0c;让原本就不好的经济形势进入了寒冬期&#xff0c;各个行业也陆续进入了寒冬期&#xff0c;纷纷进入了内卷模式&#xff0c;尤其是对于跨境电商行业来说&…

linux 部署jmeter报错处理

一、linux 安装jdk Java Downloads | Oracle 二、 linux上传jmeter 2.1 上传jmeter jmeter 下载地址&#xff1a; Apache JMeter - Download Apache JMeter 注意&#xff1a; 我先在我本地调试脚本&#xff08;mac环境&#xff09;&#xff0c;调试完成后&#xff0c;再在…

java基于ssm的饰品商城的设计与实现

管理员&#xff1b;管理员使用本系统涉到的功能主要有个人中心、用户管理、商品分类管理、商品信息管理、活动商品管理、知识普及管理、饰品圈、系统管理、订单管理等功能。 用户进入前台可以查看首页、商品信息、活动商品、知识普及、饰品圈、公告信息、个人中心、后台管理、购…

全国产!全志A40i+Logos FPGA核心板(4核ARM Cortex-A7)硬件说明

硬件资源 SOM-TLA40iF核心板板载ARM、FPGA、ROM、RAM、晶振、电源、LED等硬件资源,并通过B2B连接方式引出IO。核心板所有器件(包括B2B连接器)均采用国产工业级方案,国产化率100%。 图 1 核心板硬件框图

哪有什么互联网寒冬?献给java程序员的面试全攻略,修炼内功,强大自己才是王道!

最近很多人在讨论&#xff0c;学Java还有前途吗&#xff1f;转行Java有希望吗?Java还值得学吗&#xff1f;诸如此类的问题太多了&#xff0c;见怪不怪&#xff0c;不用担心太多&#xff0c;我们来仔细分析一下为什么会出现这种情况。 首先&#xff0c;互联网行业近几年确实很…

scrapy构造并发送请求

scrapy数据建模与请求 学习目标&#xff1a; 应用 在scrapy项目中进行建模应用 构造Request对象&#xff0c;并发送请求应用 利用meta参数在不同的解析函数中传递数据 1. 数据建模 通常在做项目的过程中&#xff0c;在items.py中进行数据建模 1.1 为什么建模 定义item即提前…

【Linux】操作系统(Operator System)

目录 一、操作系统是什么 1、操作系统概念 2、操作系统的定位 3、设计OS的目的 4、操作系统的重要性 二、 理解操作系统 三、系统调用 系统调用和库函数的关系 一、操作系统是什么 1、操作系统概念 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统…

【网络设备排障怎么破?这五个命令申请出战!】

1.网络排错常用诊断工具介绍 主流网络设备产品提供了一套完整的命令集&#xff0c;可以用于监控网络互联环境的工作状况和解决基本的网络故障。主要包括以下命令&#xff1a; Ping命令 Traceroute命令 Show命令 Clear命令 Debug命令 1.1 Ping命令 1.原理&#xff1a; “ping”…

vue+element-ui项目搭建记录

一. 安装vue&#xff08;省略&#xff09; 二. 新建vue项目并启动 1. 命令行执行新建项目命令&#xff1a; vue init webpack TestElemntUI3 //TestElemntUI3为项目名称执行结果发现有问题&#xff1a; 2. 需要安装一个全局加载项&#xff0c;执行命令&#xff1a; npm i…

ARM+DSP!全志T113-i+玄铁HiFi4开发板硬件说明书(1)

前 言 本文档主要介绍开发板硬件接口资源以及设计注意事项等内容,测试板卡为全志T113-i+玄铁HiFi4开发板。由于篇幅问题,本篇文章共分为上下两集,点击账户可查看更多内容详情,开发问题欢迎留言,感谢关注。 T113-i处理器的IO电平标准一般为1.8V和3.3V,上拉电源一般不超过…

DSTL与PA咨询公司助力英国国防部发展“量子+军事”领域

DSTL的量子实验室&#xff08;图片来源&#xff1a;网络&#xff09;如何充分利用国防和安全领域的资源并确保人员安全&#xff1f;快速准确的决策至关重要。人类虽然是决策过程的重要参与者&#xff0c;但是快节奏的决策过程对人类来说变得越来越复杂。国防科学技术实验室&…