AcWing 842. 排列数字——算法基础课题解

AcWing 842. 排列数字

题目描述

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

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

输入格式

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

输出格式

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

数据范围

1≤𝑛≤7

输入样例

3

输出样例

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

C++

#include <iostream>using namespace std;const int N = 10;
int n, path[N];
bool st[N]; // 状态数组void dfs(int u) {if (u == n)// 递归到最后一个数字{for (int i = 0; i < n; i++) printf("%d ", path[i]); // 输出保存的结果puts(" ");}for (int i = 1; i <= n; i++)if (!st[i]) // 没有被用过的数{path[u] = i;st[i] = true; // i被用过dfs(u + 1);// 走到下一层st[i] = false;// 恢复现场}
}int main() {scanf("%d", &n);dfs(0);return 0;
}
#include <iostream>using namespace std;const int N = 10;int n;
int path[N];void dfs(int u, int state) {if (u == n) {for (int i = 0; i < n; i++) printf("%d ", path[i]);puts("");return;}for (int i = 0; i < n; i++)if (!(state >> i & 1)) {path[u] = i + 1;dfs(u + 1, state + (1 << i));}
}int main() {scanf("%d", &n);dfs(0, 0);return 0;
}

state变量通过位运算来跟踪哪些数字已经被使用过。我们可以通过一个简单的例子来详细说明这一过程:

假设我们要找出 1 到 3 的所有排列。

初始化

  • state初始化为 0(二进制表示为000),表示没有任何数字被使用。

第一层递归

我们从数字 1 开始尝试,直到数字 3。

  • 尝试数字 1:
    • 检查数字 1 是否已使用:state >> 0 & 1 (即000 >> 0 & 1)结果为 0,表示数字 1 未使用。
    • 更新statestate + (1 << 0)(即000 + 001),现state变为001,表示数字 1 已使用。
    • 进入下一层递归。

第二层递归

此时,state001,表示数字 1 已被使用。

  • 尝试数字 1:
    • 检查数字 1 是否已使用:state >> 0 & 1 (即001 >> 0 & 1)结果为 1,跳过。
  • 尝试数字 2:
    • 检查数字 2 是否已使用:state >> 1 & 1 (即001 >> 1 & 1)结果为 0,表示数字 2 未使用。
    • 更新statestate + (1 << 1)(即001 + 010),现state变为011,表示数字 1 和 2 已使用。
    • 进入下一层递归。

第三层递归

此时,state011

  • 尝试数字 1:
    • 检查数字 1 是否已使用:state >> 0 & 1 (即011 >> 0 & 1)结果为 1,跳过。
  • 尝试数字 2:
    • 检查数字 2 是否已使用:state >> 1 & 1 (即011 >> 1 & 1)结果为 1,跳过。
  • 尝试数字 3:
    • 检查数字 3 是否已使用:state >> 2 & 1 (即011 >> 2 & 1)结果为 0,表示数字 3 未使用。
    • 更新statestate + (1 << 2)(即011 + 100),现state变为111,表示数字 1、2 和 3 已使用。
    • 找到排列:1 2 3。

回溯

完成当前分支后,递归函数将结束当前层的执行并返回上一层,同时state的值也会恢复到进入当前层之前的状态(通过局部变量的作用域自然实现),这样就可以继续尝试其他的数字组合。

Go

package mainimport ("bufio""fmt""os"
)const N = 10var (n      intpath   [N]intst     [N]boolwriter = bufio.NewWriter(os.Stdout)
)func dfs(u int) {if u == n {for i := 0; i < n; i++ {writer.WriteString(fmt.Sprintf("%d ", path[i]))}writer.WriteString("\n")return}for i := 1; i <= n; i++ {if !st[i] {path[u] = ist[i] = truedfs(u + 1)st[i] = false}}
}func main() {defer writer.Flush()reader := bufio.NewReader(os.Stdin)fmt.Fscan(reader, &n)dfs(0)
}
package mainimport ("bufio""fmt""os"
)const N = 10var (n      intpath   [N]intwriter = bufio.NewWriter(os.Stdout)
)func dfs(u int, state int) {if u == n {for i := 0; i < n; i++ {writer.WriteString(fmt.Sprintf("%d ", path[i]))}writer.WriteString("\n")return}for i := 0; i < n; i++ {if (state>>i)&1 == 0 {path[u] = i + 1dfs(u+1, state|(1<<i))}}
}func main() {defer writer.Flush()reader := bufio.NewReader(os.Stdin)fmt.Fscan(reader, &n)dfs(0, 0)
}

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

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

相关文章

【Unity性能优化】使用多边形碰撞器网格太多,性能消耗太大了怎么办

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 专栏交流&#x1f9e7;&…

【机器学习基础】Python编程04:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

一道java线程池面试题

线程池面试题 一个线程池的核心线程数为10个&#xff0c;最大线程数为20个&#xff0c;阻塞队列的容量为30。现在提交45个 任务&#xff0c;每个任务的耗时为500毫秒。 请问&#xff1a;这批任务执行完成总共创建几个线程&#xff1f; 请问&#xff1a;这批任务执行完成总计需…

快团团有货源的供货大团长如何给单个订单发货?

快团团团长给单个订单发货的步骤如下&#xff1a; 登录快团团商家后台&#xff1a;首先&#xff0c;你需要以团长的身份登录快团团的商家后台管理系统。 进入订单管理页面&#xff1a;登录后&#xff0c;在后台导航中找到并点击“订单管理”或类似的选项&#xff0c;进入订单列…

C语言中的#和##操作符用法

C语言中#和##操作符用法 答&#xff1a;在C语言中&#xff0c;#和##是预处理器&#xff08;preprocessor&#xff09;的操作符&#xff0c;主要用于宏&#xff08;macro&#xff09;的定义中。这两个操作符提供了字符串化和字符串连接的功能。 #操作符 #操作符用于将其后的宏…

算法人生(19): 从“LangChain的六大组件”看“个人职业规划”

我们今天要说说和大模型有着密切关系的Langchain &#xff0c;它提供了一个平台&#xff0c;让开发者可以更加轻松地训练、部署和管理这些大模型。具体来说&#xff0c;Langchain 可以通过提供高性能的计算资源、灵活的模型管理和部署选项、以及丰富的监控和调试功能&#xff0…

Python语言试卷:深入剖析Python编程的精髓

Python语言试卷&#xff1a;深入剖析Python编程的精髓 在编程的世界里&#xff0c;Python以其简洁、易读和强大的功能赢得了众多开发者的青睐。为了全面检验大家对Python语言的理解程度&#xff0c;本试卷将从四个方面、五个方面、六个方面和七个方面展开深入剖析&#xff0c;…

企业软件产品和服务 之 设计保证安全 七项承诺

1. 引言 公司如何保护自己免受数据泄露的影响&#xff1f;标准答案就是&#xff1a; “启用多因素身份验证”——MTA&#xff08;Enable multifactor authentication&#xff09;。 但是&#xff0c;目前很多公司仍然盲目地只使用密码作为唯一的身份来源。 网络安全的核心是…

Python怎么定义类:深入探索与实战解析

Python怎么定义类&#xff1a;深入探索与实战解析 在Python编程的广阔天地中&#xff0c;定义类是一项基础且至关重要的技能。类作为面向对象编程的核心构造&#xff0c;为我们提供了一种组织和封装代码、创建可重用对象的方式。今天&#xff0c;我们将从四个方面、五个方面、…

【分享】两种方法设置PDF“打开密码”

想要保护PDF文件的私密性&#xff0c;只允许特定人查看&#xff0c;我们可以给PDF设置“打开密码”&#xff0c;这样只有知道密码的人才可以打开文件。如果小伙伴们不知道如何设置&#xff0c;就一起看看以下两种方法吧&#xff01; 方法1&#xff1a;使用PDF编辑器 大部分PD…

Leetcode:罗马数字转整数

题目链接&#xff1a;13. 罗马数字转整数 - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;模拟&#xff09; 分析&#xff1a;通常情况下&#xff0c;罗马数字中小的数字在大的数字的右边。若输入的字符串满足该情况&#xff0c;累加每个字符对应的数值即可&am…

HarmonyOS(二十四)——Harmonyos通用事件之触摸事件

1.触摸事件。 触摸事件是HarmonyOS通用事件的一种事件之一&#xff0c;当手指在组件上按下、滑动、抬起时触发。 名称是否冒泡功能描述onTouch(event: (event?: TouchEvent) > void)是手指触摸动作触发该回调&#xff0c;event返回值见下面TouchEvent介绍。 2. TouchEve…

埃隆·马斯克 - 从梦想家到改变世界的企业家

埃隆马斯克 - 从梦想家到改变世界的企业家 本文内容是埃隆马斯克传的重点章节精华提炼&#xff0c;介绍了马斯克传奇一生 参考资料内容&#xff1a;埃隆马斯克传&造梦者埃隆马斯克 参考资料在文末获取&#xff0c;关注我&#xff0c;分享优质前沿资料&#xff08;IT、运…

交互设计专业解析:发展前景和薪资待遇

交互式设计专业是一门旨在帮助人们更好地与数字产品和服务互动的设计学科。交互式设计专业涉及人机交互、用户体验设计、用户界面设计等多个不同领域。交互式设计是当今数字时代不可缺少的一部分。它能为用户提供更好的体验和更高效的功能&#xff0c;为企业创造更高的价值和影…

LabVIEW储油罐监控系统

LabVIEW储油罐监控系统 介绍了基于LabVIEW的储油罐监控系统的设计与实施。系统通过集成传感器技术和虚拟仪器技术&#xff0c;实现对储油罐内液位和温度的实时监控&#xff0c;提高了油罐监管的数字化和智能化水平&#xff0c;有效增强了油库安全管理的能力。 项目背景 随着…

买卖股票的各种最佳时机问题

买卖股票的最佳时机 分析 根据题意可知&#xff0c;我们只需要找出来一个最小价格的股票和一个最大价格的股票&#xff0c;并且最小价格的股票出现在最大价格的股票之前。 如果尝试使用暴力解法&#xff0c;时间复杂度为O(N^2)&#xff0c;对于题目中给的长度&#xff0c;显然…

金士顿U盘被写保护的解决方法

1.适用的U盘芯片信息 USB设备ID: VID 0951 PID 1666 设备供应商: Kingston 设备名称: DataTraveler 3.0 设备修订版: 0110 产品制造商: Kingston 产品型号: DataTraveler 3.0 产品修订版: PMAP 主控厂商: Phison(群联) 主控型号: PS2251-07(PS2307) - F/W 08.03.50 [2018-…

从学士-硕士-博士-博士后-副教授-教授-优青-杰青-长江-院士:一文看懂学术巨人的成长历程

会议之眼 快讯 学术之路&#xff0c;如同攀登一座高耸入云的山峰&#xff0c;需要毅力、智慧和不断的求知探索。从奠定基础的学士&#xff0c;到站在学术巅峰的院士。这条成长之路充满了挑战和机遇。 如果把学术界比作王者荣耀&#xff0c;那么学者们的成长历程就像是在进行一…

SpringBoot-SchedulingConfigurer源码初识:理解定时任务抛异常终止本次调度,但不会影响下一次执行调度

SchedulingConfigurer源码初识&#xff1a;理解定时任务抛异常终止本次调度&#xff0c;但不会影响下一次执行调度 EnableSchedulingScheduledAnnotationBeanPostProcessor进入finishRegistration方法 ScheduledTaskRegistrar处理触发器任务&#xff08;TriggerTask&#xff09…

F5G城市光网,助力“一网通城”筑基数字中国

《淮南子》中说&#xff0c;“临河而羡鱼&#xff0c;不如归家织网”。 这句话在后世比喻为做任何事情都需要提前做好准备&#xff0c;有了合适的工具&#xff0c;牢固的基础&#xff0c;各种难题也会迎刃而解。 如今&#xff0c;数字中国发展建设如火如荼&#xff0c;各项任务…