【递归】P1706全排列问题
题目相关
题目描述
输出自然数 1 到 n所有不重复的排列,即 n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
一个整数 n**。
输出格式
由 1∼n 组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5个场宽。
输入输出样例
输入
3
输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
说明/提示
1≤n≤9
原题链接
分析
阅读完题目之后发现,描述得还是非常简单的。先思考下在生活当中我们是如何处理这样的数学问题的。首先,为了保证不重复和遗漏,我们一般会一个数,一个数确定过去,先确定第一个数,再在这个基础上确定第二个数,再是第三个,第四个以此类推。每次都是要找不重复出现的。
再分析一下,可以发现,每次在确定第几个数字时,我们的方法都是一样的,都是从1~n的数字当中找出不重复的数字,直到我们确定好n个数字为止。
过程当中,不断发生变化的是,确定好了第几个数,已经确定了几个,以及目标是确定几个。那么,可以先构造出函数的框架出来。
void dfs(int done,int ranks[],int n){
//done-已经选好的个数 ranks[]-选好数字的存储的地方
//n-目标数量及范围
//实现过程
if(done==n){//选好的数量达到要求
for(int i=0;i<n;i++){//输出
cout<<ranks[i]<<" ";
}
cout<<endl;
}else{
for(int i=1;i<=n;i++){
if(){//i没出现过
ranks[done]=i;//存储i
dfs(done+1,ranks,n);//用相同方法寻找下一个
}
}
}
}
接着,再考虑如何进行是否重复的判断。一是可以将之前存在ranks[]中的再枚举一遍,但是这样太麻烦了。我们可以构造一个标记数组,用它来表明数字是否已经被用过了。
bool vis[10005];//vis[x]=true/fals x被使用过/没有使用过
...
for(int i=1;i<=n;i++){
if(vis[i]==false){//i没出现过
ranks[done]=i;//存储i
vis[i]=true;//修改使用的状态
dfs(done+1,ranks,n);//用相同方法寻找下一个
vis[i]=false;//!!将状态进行回溯!!重要
}
}
最后注意输出的时候的特殊要求,“每个数字保留 5个场宽”。可以使用"printf("%5d")"的方式来实现。
代码实现
#include <iostream>
#include <cstdio>
using namespace std;
bool vis[15];//vis[i]=true/false i有出现过/没出现过
void dfs(int done,int n,int ranks[]){
//done-已经选好的个数 ranks[]-选好数字的存储的地方
//n-目标数量及范围
//实现过程
if(n==done){//选好的数量达到要求
for(int i=0;i<n;i++)
printf("%5d",ranks[i]);
cout<<endl;
}else{
for(int i=1;i<=n;i++){
if(vis[i]==false){//i没出现过
ranks[done]=i;//存储i
vis[i]=true;//修改使用的状态
dfs(done+1,n,ranks);//用相同方法寻找下一个
//状态的回溯
vis[i]=false;
}
}
}
}
int main(){
int n;
int ranks[15]={0};
cin>>n;
dfs(0,n,ranks);
return 0;
}

讲解视频
【递归】P1706全排列问题的更多相关文章
- 洛谷 P1706 全排列问题
题目链接 https://www.luogu.org/problemnew/show/P1706 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数 ...
- 洛谷——P1706 全排列问题
P1706 全排列问题 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成 ...
- 洛谷P1706全排列问题
P1706 全排列问题 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组 ...
- 洛谷 P1706 全排列
可能是最简单的题了……讲真搜索hhh 洛谷 P1706 全排列问题 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: ...
- 递归实现全排列序列C语言实现
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下鄙人用递归回溯的办法,采用C语言实现了全排列序列,用以某些优化方案的原始方案的给定 #incl ...
- JAVA递归实现全排列
全排列(permutation) 排列组合概念 排列,就是指从给定n个数的元素中取出指定m个数的元素,进行排序 组合,则是指从给定n个数的元素中仅仅取出指定m个数的元素,不考虑排序 全排列 以数字为例 ...
- [C++] 递归之全排列问题、半数集
一.递归的定义 一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个原问题相似的规模较小的问题来求解. 二.用递归求解问题的主要步骤 1.找出相似性 ...
- 洛谷P1706 全排列问题
题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列, ...
- 递归实现全排列python
python递归实现"abcd"字符串全排列 1.保持a不动,动bcd 2.保持b不动,动cd 3.保持c不动,动d def pailie(head="",st ...
随机推荐
- pytorch SubsetRandomSampler 用法和说明
官网:https://pytorch.org/docs/stable/data.html?highlight=subsetrandomsampler#torch.utils.data.SubsetRa ...
- 网络拓扑实例13:IPv4静态路由与NQA联动简介
组网图形 IPv4静态路由与NQA联动简介 网络质量分析NQA(Network Quality Analysis)是一种实时的网络性能探测和统计技术,可以对响应时间.网络抖动.丢包率等网络信息进行统计 ...
- P6772 [NOI2020]美食家
题目大意 给你一个 \(n\) 个点,\(m\) 条边的有向图,每条边有一个权值 \(w_i\) ,每个节点有一个权值 \(a_i\) . 你从节点 \(1\) 出发,每经过一个节点就可以获得该点的权 ...
- 5.深入Istio源码:Pilot-agent作用及其源码分析
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的Istio源码是 release 1.5. 介绍 Sidecar在注入的时候会 ...
- 封装事件订阅来进行非父子组件的传值(React)
const list={} // 将事件名和事件函数装进事件池里 function $on(name,func) { if(!name || !func) return; if(!Object.key ...
- 【Jmeter 常用方法】
https://www.jianshu.com/p/a4922b0dceba 如果if控制器的使用
- 精尽Spring MVC源码分析 - MultipartResolver 组件
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- 公司项目适配IOS9总结
1.JSONKit 项目在xcode7 IOS9 开发环境上报错,不能进行JSONSring和JSONData的使用 .在真机上没有问题,在模拟器上put和post数据适合JSONKit报空对象野指针 ...
- Unity 黑暗之光 笔记 第一章
第一章 设计游戏开始进入场景 1.设置相机视野同步 选中要调整的相机 GameObject - Align With View(快捷键 Ctrl + Shift + F)
- 腾讯健康码16亿亮码背后的Elasticsearch系统调优实践【>>戳文章免费体验Elasticsearch服务30天】
[活动]Elasticsearch Service免费体验馆>>Elasticsearch Service新用户特惠狂欢低至4折>>Elasticsearch Service企 ...