当前位置: 首页 > news >正文

【普及−】洛谷P1706 全排列问题

见:P1706 全排列问题 - 洛谷

题目描述

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

输入格式

一个整数 n。

输出格式

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

每个数字保留 5 个场宽。

输入输出样例

输入 #1

3

输出 #1

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

说明/提示

1≤n≤9。

算法解析

DFS,

对楼上的回溯+剪枝进行详解。

我们以N=3为例,

构造一棵搜索树(或说是状态树)来进行搜索。

同时构造出三个格子,

用来存放搜索树中的结果。

现在,我们从第一格开始搜索。

第一格填1的搜索树如下:

所以N=3的情况下,

第一格填1的排列情况共有两种123,132.

第一格填2的搜索树如下:

所以N=3的情况下,

第一格填2的排列情况共有两种 213,231.

如果你看懂了,

请你自己画画第一格填3的搜索树。

程序实现

我们总结一下在上一部分中的思路在程序中如何实现。

先定义两个数组,

一个是用来存放解的,

一个是用来标记该数是否用过。

接下来就是写深搜的函数了。

主要思路:

先判断格子是否填满了,

如果填满,

则print()一下。

如果没有填满,

则开始循环,

在循环中先判断当前填的数是否用过,

如果没有,

则填入,

搜索下一格。

程序实现如下:

#include <bits/stdc++.h>
using namespace std;
#define int long long//十年OI一场空,不开long long见祖宗
const int maxn=10;
int a[maxn];
int t[maxn];
int n;void dfs(int k){if(k==n+1){for(int i=1;i<=n;i++){cout<<"    "<<a[i];}cout<<endl;return;}for(int i=1;i<=n;i++){if(t[i]==0){a[k]=i;t[i]=1;dfs(k+1);t[i]=0;}		}return;
}signed main() {	cin>>n;dfs(1);return 0;
}

三连一下吧

欢迎评论

相关文章:

  • HOMIE——遥操类似ALOHA主从臂的外骨骼驾驶舱收集数据:通过上肢模仿学习和全身控制RL训练自主策略
  • flutter加载dll 报错问题
  • FastApi学习
  • 生成式引擎在不同行业的应用案例
  • 三级联动获取省市区
  • 【razor】采集的同时支持预览和传输的讨论和改造方案探讨
  • leetcode0670. 最大交换-medium
  • 【AUTOSAR OS】 保护功能解析:从原理到应用与源代码解析(下篇)
  • SSE vs WebSocket:两种通讯方案该如何选择?
  • Python学习(3) ----- Python的函数定义及其使用
  • 去除ai写作痕迹的软件有哪些
  • 打卡第31天:模块和库的导入
  • 生成式引擎的认知霸权:为什么传统内容失效?
  • 【超详细教程】零基础本地部署DeepSeek-Coder-v2 16B!Ollama+GPU加速,100%跑通!
  • 政策支持下的PLM国产化浪潮:国产PLM的最新应用、前沿技术、反超路径
  • 02-BTC-密码学原理 对hash算法如果出现漏洞的思考
  • Linux线程机制揭秘:从内核实现到用户态编程(二)
  • ROC和生存曲线的绘制-spss
  • C语言中:递归问题的深入研究
  • 华南会议|AI驱动仿真未来 2025 Altair区域技术交流会华南站,报名开启!
  • 河池市住房和城乡建设厅网站/seo视频教程百度云
  • 应用商店app下载安装最新版软件/无锡网站建设方案优化
  • 成都网站seo服务/seo在线网站推广
  • 医院网站建设投标书/百度推广退款电话
  • 水土保持生态建设网站/seo点击排名器
  • 网站历史记录怎么恢复/链接交换公司