题目相关

题目描述

输出自然数 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

原题链接

P1706 全排列问题 - 洛谷

分析

阅读完题目之后发现,描述得还是非常简单的。先思考下在生活当中我们是如何处理这样的数学问题的。首先,为了保证不重复和遗漏,我们一般会一个数,一个数确定过去,先确定第一个数,再在这个基础上确定第二个数,再是第三个,第四个以此类推。每次都是要找不重复出现的。

再分析一下,可以发现,每次在确定第几个数字时,我们的方法都是一样的,都是从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全排列问题的更多相关文章

  1. 洛谷 P1706 全排列问题

    题目链接 https://www.luogu.org/problemnew/show/P1706 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数 ...

  2. 洛谷——P1706 全排列问题

    P1706 全排列问题 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成 ...

  3. 洛谷P1706全排列问题

     P1706 全排列问题 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组 ...

  4. 洛谷 P1706 全排列

    可能是最简单的题了……讲真搜索hhh 洛谷 P1706 全排列问题 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: ...

  5. 递归实现全排列序列C语言实现

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下鄙人用递归回溯的办法,采用C语言实现了全排列序列,用以某些优化方案的原始方案的给定 #incl ...

  6. JAVA递归实现全排列

    全排列(permutation) 排列组合概念 排列,就是指从给定n个数的元素中取出指定m个数的元素,进行排序 组合,则是指从给定n个数的元素中仅仅取出指定m个数的元素,不考虑排序 全排列 以数字为例 ...

  7. [C++] 递归之全排列问题、半数集

    一.递归的定义 一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个原问题相似的规模较小的问题来求解. 二.用递归求解问题的主要步骤 1.找出相似性 ...

  8. 洛谷P1706 全排列问题

    题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列, ...

  9. 递归实现全排列python

    python递归实现"abcd"字符串全排列 1.保持a不动,动bcd 2.保持b不动,动cd 3.保持c不动,动d def pailie(head="",st ...

随机推荐

  1. 性能测试学习之路 (一)认识jmeter(性能测试流程 && 性能测试通过标准 &&jmeter体系结构)

    性能测试是通过自动化的测试工具模拟多种正常.峰值以及异常负载条件来对系统的各项性能指标进行测试. 1 性能测试技能树 性能测试是一项综合性的工作,致力于暴露性能问题,评估系统性能趋势.性能测试工作实质 ...

  2. [BJDCTF 2nd]假猪套天下第一 && [BJDCTF2020]Easy MD5

    [BJDCTF 2nd]假猪套天下第一 假猪套是一个梗吗? 进入题目,是一个登录界面,输入admin的话会返回错误,登录不成功,其余用户可以正常登陆 以为是注入,简单测试了一下没有什么效果 抓包查看信 ...

  3. 【题解】CIRU - The area of the union of circles [SP8073] \ 圆的面积并 [Bzoj2178]

    [题解]CIRU - The area of the union of circles [SP8073] \ 圆的面积并 [Bzoj2178] 传送门: \(\text{CIRU - The area ...

  4. linux修改文件所属的用户组以及用户

    linux修改文件所属的用户组以及用户 将文件夹从A用户(huangxf)目录复制B用户(zhenglf)目录,其中B没有sudo权限.将A的Downloads文件夹下的所有文件,复制到B的Docum ...

  5. Angular:使用前端proxy代理解决跨域问题

    ①在项目文件的根目录下新建文件proxy.config.json { "/": { "target": "http://127.0.0.1:3000& ...

  6. css3动画帧

    动画帧实现: css3使用steps来实现逐帧动画,动画过程中可能出现抖动,实乃精度偏差问题. 通常在动画里用到百分比单位时会出现抖动或位移现象,解决方法就是转换成具体的rem或px长度单位. 动画一 ...

  7. STL——容器(Set & multiset)的概念和特点

    1. Set 和 multiset 的概念 set 和 multiset 是一个集合容器,其中 set 所包含的元素是唯一的,集合中的元素按一定的顺序排列.set 采用红黑树变体的数据结构实现,红黑树 ...

  8. 七、TestNG传递参数2

    数据提供者本身可以接受两个类型的参数:Method和ITestContext 在创建@DataProvider方法是可以有四种格式如图: 第一种在上一篇中有学到 1-Methode参数使用 @Data ...

  9. Vue 组件化开发的思想体现

    现实中的组件化思想化思想体现 标准(同一的标准) 分治(多人同时开发) 重用(重复利用) 组合(可以组合使用) 编程中的组件化思想 组件化规范:Web Components 我们希望尽可能多的重用代码 ...

  10. 01-docker基本使用

    docker 常用命令 指令 说明 docker images 查看已经下载的镜像 docker rmi 镜像名称:标签名 删除已经下载的镜像 docker search 镜像 从官方仓库中查看镜像 ...