洛谷P1706 全排列题解

P1706 全排列问题

题目描述

按照字典序输出自然数 1 1 1 n n n 所有不重复的排列,即 n n n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

一个整数 n n n

输出格式

1 ∼ n 1 \sim n 1n 组成的所有不重复的数字序列,每行一个序列。

每个数字保留 5 5 5 个场宽。

输入输出样例 #1

输入 #1

3

输出 #1

	1    2    31    3    22    1    32    3    13    1    23    2    1

说明/提示

1 ≤ n ≤ 9 1 \leq n \leq 9 1n9

这个问题呢,是很明显的DFS(深度优先搜索)的问题,如果你们不了解DFS,可以自己去上网查。我简单的说一下概念:

DFS是一种用于遍历或搜索树或图的算法,其核心思想是"尽可能深"地搜索图的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。

可能有些人懵了,所以,说白了就是: 不撞南墙不回头 \color{red}不撞南墙不回头 不撞南墙不回头

再简单点:

  • 为了求得问题的解,先选择某一种可能情况向前探索;
  • 在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索;
  • 如此反复进行,直至得到解或证明无解。
DFS的操作步骤

1.假设一个数组a[5][5],零代表墙,一代表路,初始点是a[1][1],要到达a[n][n]。

假如数组为:

6

dfs方式如下:
5

大家应该也比较了解DFS了吧,那我们便开始讲题;

做题目的第一步:搞好DFS前要条件

#include<bits/stdc++.h>
using namespace std;
int n, a[15], book[15];
/*我们将题目的输入变量 n 定义出来;
a 数组是排列的结果,book 数组是标记某个数字有没有用 */
int main(){cin >> n;return 0;
}

做题目的第二步:做好DFS边界处理

#include<bits/stdc++.h>
using namespace std;
int n, a[15], book[15];
/*我们将题目的输入变量 n 定义出来;
a 数组是排列的结果,book 数组是标记某个数字有没有用 */
void dfs(int x){if(x > n){//代表已经可以了,所有的数字都排好了for(int i = 1; i <= n; i ++){cout << setw(5) << a[i];//题目要求5个场宽}cout << endl;return ;//回溯(返回)}}
int main(){cin >> n;return 0;
}

做题目的第三步:写好DFS数组排列

#include<bits/stdc++.h>
using namespace std;
int n, a[15], book[15];
/*我们将题目的输入变量 n 定义出来;
a 数组是排列的结果,book 数组是标记某个数字有没有用 */
void dfs(int x){if(x > n){//代表已经可以了,所有的数字都排好了for(int i = 1; i <= n; i ++){cout << setw(5) << a[i];//题目要求5个场宽}cout << endl;return ;//回溯(返回)}for(int i = 1; i <= n; i ++){if(book[i] == 0){//如果这个数没有用过a[x] = i;//标记(x 作为第几位)book [i] = 1; // 这个数用过了dfs(x + 1); //进行下一位的排列book [i] = 0; //回溯时因为新的一轮开始,所以没有用过,重新标记}}
}
int main(){cin >> n;dfs(1);//进行DFSreturn 0;
}

这时候,代码就写完了,没听懂的同学可以看一下模拟过程,听懂的同学可以一键三联吗:

全排列问题的模拟过程

初始状态

  • n = 3
  • 数组 a = [0, 0, 0, ...] (初始全为0)
  • 标记数组 book = [0, 0, 0, ...] (初始全为0,表示所有数字未被使用)

调用 dfs(1)

dfs(1) - 第一层递归 (x=1)

循环 i 从 1 到 3:

  1. i=1:

    • book[1]==0,可以使用
    • 设置 a[1]=1
    • 标记 book[1]=1
    • 调用 dfs(2)
    dfs(2) - 第二层递归 (x=2)

    循环 i 从 1 到 3:

    1. i=1:

      • book[1]==1,跳过
    2. i=2:

      • book[2]==0,可以使用
      • 设置 a[2]=2
      • 标记 book[2]=1
      • 调用 dfs(3)
      dfs(3) - 第三层递归 (x=3)

      循环 i 从 1 到 3:

      1. i=1:

        • book[1]==1,跳过
      2. i=2:

        • book[2]==1,跳过
      3. i=3:

        • book[3]==0,可以使用
        • 设置 a[3]=3
        • 标记 book[3]=1
        • 调用 dfs(4)
        dfs(4) - 第四层递归 (x=4)

        x>n,输出排列: 1 2 3 (每个数字占5个宽度)

        • 返回
      • 回溯: book[3]=0

      • 循环结束

    • 回溯: book[2]=0
    1. i=3:

      • book[3]==0,可以使用
      • 设置 a[2]=3
      • 标记 book[3]=1
      • 调用 dfs(3)
      dfs(3) - 第三层递归 (x=3)

      循环 i 从 1 到 3:

      1. i=1:

        • book[1]==1,跳过
      2. i=2:

        • book[2]==0,可以使用
        • 设置 a[3]=2
        • 标记 book[2]=1
        • 调用 dfs(4)
        dfs(4) - 第四层递归 (x=4)

        x>n,输出排列: 1 3 2

        • 返回
      • 回溯: book[2]=0
      1. i=3:
        • book[3]==1,跳过
    • 回溯: book[3]=0

    • 循环结束

  • 回溯: book[1]=0
  1. i=2:

    • book[2]==0,可以使用
    • 设置 a[1]=2
    • 标记 book[2]=1
    • 调用 dfs(2)
    dfs(2) - 第二层递归 (x=2)

    循环 i 从 1 到 3:

    1. i=1:

      • book[1]==0,可以使用
      • 设置 a[2]=1
      • 标记 book[1]=1
      • 调用 dfs(3)
      dfs(3) - 第三层递归 (x=3)

      循环 i 从 1 到 3:

      1. i=1:

        • book[1]==1,跳过
      2. i=2:

        • book[2]==1,跳过
      3. i=3:

        • book[3]==0,可以使用
        • 设置 a[3]=3
        • 标记 book[3]=1
        • 调用 dfs(4)
        dfs(4) - 第四层递归 (x=4)

        输出排列: 2 1 3

        • 返回
      • 回溯: book[3]=0
    • 回溯: book[1]=0
    1. i=2:

      • book[2]==1,跳过
    2. i=3:

      • book[3]==0,可以使用
      • 设置 a[2]=3
      • 标记 book[3]=1
      • 调用 dfs(3)
      dfs(3) - 第三层递归 (x=3)

      循环 i 从 1 到 3:

      1. i=1:

        • book[1]==0,可以使用
        • 设置 a[3]=1
        • 标记 book[1]=1
        • 调用 dfs(4)
        dfs(4) - 第四层递归 (x=4)

        输出排列: 2 3 1

        • 返回
      • 回溯: book[1]=0
      1. i=2:

        • book[2]==1,跳过
      2. i=3:

        • book[3]==1,跳过
    • 回溯: book[3]=0

    • 循环结束

  • 回溯: book[2]=0
  1. i=3:

    • book[3]==0,可以使用
    • 设置 a[1]=3
    • 标记 book[3]=1
    • 调用 dfs(2)
    dfs(2) - 第二层递归 (x=2)

    循环 i 从 1 到 3:

    1. i=1:

      • book[1]==0,可以使用
      • 设置 a[2]=1
      • 标记 book[1]=1
      • 调用 dfs(3)
      dfs(3) - 第三层递归 (x=3)

      循环 i 从 1 到 3:

      1. i=1:

        • book[1]==1,跳过
      2. i=2:

        • book[2]==0,可以使用
        • 设置 a[3]=2
        • 标记 book[2]=1
        • 调用 dfs(4)
        dfs(4) - 第四层递归 (x=4)

        输出排列: 3 1 2

        • 返回
      • 回溯: book[2]=0
    • 回溯: book[1]=0
    1. i=2:

      • book[2]==0,可以使用
      • 设置 a[2]=2
      • 标记 book[2]=1
      • 调用 dfs(3)
      dfs(3) - 第三层递归 (x=3)

      循环 i 从 1 到 3:

      1. i=1:

        • book[1]==0,可以使用
        • 设置 a[3]=1
        • 标记 book[1]=1
        • 调用 dfs(4)
        dfs(4) - 第四层递归 (x=4)

        输出排列: 3 2 1

        • 返回
      • 回溯: book[1]=0
      1. i=2:

        • book[2]==1,跳过
      2. i=3:

        • book[3]==1,跳过
    • 回溯: book[2]=0
    1. i=3:
      • book[3]==1,跳过
    • 循环结束
  • 回溯: book[3]=0

到了这里,大家应该听懂了,记得一键三连哦!

d

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

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

相关文章

yum install 报错(CentOS换源):

yum instally yum utils device mapper persistent-data lvm2 报错&#xff1a; 排查错误原因&#xff1a;centos7 系统停止维护了 解决方案&#xff1a;换源&#xff08;更换操作系统&#xff09; //1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-…

C语言学习笔记(抱佛脚版)

毕业一年&#xff0c;发现记性是真的差&#xff0c;每次想起之前的知识总是想不全&#xff0c;看别人写的资料也懵懵懂懂。于是我索性自己再学一遍&#xff0c;并且记录一下。希望对你们也有所帮助。 正片开始&#xff01; 前面的什么if for都不难理解&#xff0c;嵌套的话也…

攻破tensorflow,勇创最佳agent(2)---损失(loss) 准确率(accuracy)问题

实战播: 怎么判定一个模型好不好,你设置的值对不对? 需要再看几个值: 例如: model Sequential()for units in model_structure:model.add(Dense(units, activationrelu))model.add(Dropout(train_config.get(dropout_rate, 0.3)))model.add(Dense(1, activationsigmoid)) 他…

Docker-Volume数据卷详讲

Docker数据卷-Volume 一&#xff1a;Volume是什么&#xff0c;用来做什么的 当删除docker容器时&#xff0c;容器内部的文件就会跟随容器所销毁&#xff0c;在生产环境中我们需要将数据持久化保存&#xff0c;就催生了将容器内部的数据保存在宿主机的需求&#xff0c;volume …

使用Selenium和lxml库搜房网爬取某地区房屋信息(python、pycharm爬虫)

一、地址&#xff1a; url "https://zb.newhouse.fang.com/house/s/b91" # 第一页的 URL 但是这个爬虫我不知道为啥总是翻不了页数&#xff0c;请帮忙修改一下~ 二、用到的知识点以及代码详解&#xff1a; 这段代码是一个使用Selenium和lxml库实现的网页爬虫&a…

ai画图comfyUI 精准定位gligen。允许指定图像中多个对象的位置和大小

基础功能下&#xff0c;outpainting是内容填充&#xff0c;拉近拉远镜头&#xff0c;自动填充旁边物体。嵌入模型也需要单独下载&#xff0c;演示完示例后推荐模型站有更直观效果介绍和用法。选中精确定位。看一眼坐标&#xff0c;直接默认出一张图。然后修改定位&#xff0c;和…

如何自动化同义词并使用我们的 Synonyms API 进行上传

作者&#xff1a;来自 Elastic Andre Luiz 了解如何使用 LLM 来自动识别和生成同义词&#xff0c; 使术语可以通过程序方式加载到 Elasticsearch 同义词 API 中。 提高搜索结果的质量对于提供高效的用户体验至关重要。优化搜索的一种方法是通过同义词自动扩展查询词。这样可以更…

boost.asio

as&#xff08;async&#xff09;:异步 同步io&#xff1a; reactor (非阻塞)&#xff08;需要注册一次&#xff0c;在等待消息时可以干别的事&#xff09; 阻塞io网络模型 接口&#xff1a;read\accept\connect\write 接口返回时&#xff0c;io完成 异步…

数据库后续

-- 添加作者字段 alter table t_hero add author varchar(100); -- 更新数据 update t_hero set author "曹雪芹" where id 1; update t_hero set author "曹雪芹" where id 2; update t_hero set author "曹雪芹" where id 3; upd…

计算机网络基础:网络流量工程与优化策略

计算机网络基础:网络流量工程与优化策略 一、前言二、网络流量工程基础2.1 网络流量工程的定义与目标2.2 网络流量的测量与分析2.2.1 常用的流量测量方法2.2.2 流量数据分析三、网络流量工程的优化策略3.1 链路负载均衡策略3.1.1 基于目的地址的负载均衡3.1.2 基于流量权重的负…

H5DS编辑器教程——H5页面触发动画实战指南

在 H5 页面设计中&#xff0c;触发动画通过动态交互提升用户体验&#xff0c;成为吸引注意力的关键手段。H5DS 编辑器作为一款高效的可视化工具&#xff0c;提供了丰富的动画制作功能&#xff0c;即使是零基础用户也能轻松实现专业级效果。 使用工具&#xff1a;H5DS编辑器 触…

什么是具身智能

具身智能&#xff08;Embodied Intelligence&#xff09;是人工智能与机器人学交叉的前沿领域&#xff0c;强调智能体通过身体与环境的动态交互实现自主学习和进化&#xff0c;其核心在于将感知、行动与认知深度融合‌。通俗地讲&#xff0c;就是机器人或者智能系统在物理环境中…

Java实现pdf中动态插入图片

今天接到一个需求&#xff0c;需要在pdf中的签名处&#xff0c;插入签名照片&#xff0c;但签名位置不固定&#xff0c;话不多说上代码&#xff1a; 1、首先引入itextpdf依赖包&#xff1a; <dependency><groupId>com.itextpdf</groupId><artifactId>…

MySQL8.4 InnoDB Cluster高可用集群使用指南

简介 高可用方案 Orchestrator&#xff1a; 可视化 Web 界面管理 MySQL 拓扑结构&#xff0c;并且兼容多种复制架构&#xff08;异步、半同步、GTID&#xff09;&#xff0c;提供自动和手动的故障转移。但是8.0.21后 MySQL 更新了主从复制相关命令&#xff0c;Orchestrator无…

从泛读到精读:合合信息文档解析如何让大模型更懂复杂文档

从泛读到精读&#xff1a;合合信息文档解析如何让大模型更懂复杂文档 一、引言&#xff1a;破解文档“理解力”瓶颈二、核心功能&#xff1a;合合信息的“破局”亮点功能亮点1&#xff1a;复杂图表的高精度解析图表解析&#xff1a;为大模型装上精准“标尺”表格数据精准还原 功…

git:远程仓库拉取到本地,fork到本地,修改后再上传

讲述仓库成员拉取远程仓库&#xff08;即组长的仓库&#xff0c;里面有成员&#xff09;到本地&#xff0c;修改内容再上传的详细步骤&#xff1a; 1.进入仓库&#xff0c;首先fork &#xff08;如不&#xff0c;所作操作会直接对远程仓库进行&#xff0c;不用管理员审核&…

windows清除电脑开机密码,可保留原本的系统和资料,不重装系统

前言 很久的一台电脑没有使用了&#xff0c;开机密码忘了&#xff0c;进不去系统 方法 1.将一个闲置u盘设置成pe盘&#xff08;注意&#xff0c;这个操作会清空原来u盘的数据&#xff0c;需要在配置前将重要数据转移走&#xff0c;数据无价&#xff0c;别因为配置这个丢了重…

频谱分析仪的最大保持功能

专门应用于例如遥控器之类的&#xff0c;按一下&#xff0c;一瞬间出现的信号的测量。 把仪器连接天线&#xff0c;观测空间中的一些信号&#xff0c;比如WIFI的信号&#xff0c;我们可以看到仪器接收到的信号其实是一直变化的&#xff0c;并不是每一次扫描都能扫到我们想要的这…

智能粉尘监测解决方案|守护工业安全,杜绝爆炸隐患

在厂房轰鸣的生产线上&#xff0c;一粒微小粉尘的聚集可能成为一场灾难的导火索。如何实现粉尘浓度的精准监控与快速响应&#xff1f;我们为您打造了一套"感知-预警-处置"全闭环的智能安全方案&#xff01; 行业痛点&#xff1a;粉尘管理的生死线 在金属加工、化工…

Excel处理控件Aspose.Cells指南:如何在不使用 Microsoft Excel 的情况下解锁 Excel 工作表

Microsoft Excel 允许用户使用密码保护工作表&#xff0c;以防止未经授权的更改。但是&#xff0c;在某些情况下&#xff0c;您可能需要在不使用 Microsoft Excel 的情况下解锁 Excel 工作表。在本指南中&#xff0c;我们将探讨解锁 Excel 工作表的不同方法&#xff0c;例如使用…