全排列算法问题
来源:互联网 发布:淘宝提示清洗怎么办 编辑:程序博客网 时间:2024/05/16 01:17
ACM经典算法题目
输入n,输出1~n的全排列
如输入:3
输出:
123132……
如图:
关于这个问题要如何实现呢:
大家可以自己先思考一下,下面我说一下答案。
这其实是一道简单的深度优先搜索的题目
代码:
#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;#define MAX_N 1000bool used[MAX_N];int perm[MAX_N];void permutation1(int pos, int n){ if(pos == n) { for(int i = 0; i < n; i++) { printf("%d ", perm[i]); } printf("\n"); return ; } for(int i = 0; i < n; i++) { if(!used[i]) { perm[pos] = i; used[i] = true; permutation1(pos+1, n); used[i] = false; } } return ;}int main(){ int n; scanf("%d", &n); permutation1(1, n+1); return 0;}
结果:
如果对代码有问题的小伙伴我猜是对这一段代码块不理解
for(int i = 0; i < n; i++) { if(!used[i]) { perm[pos] = i; used[i] = true; permutation1(pos+1, n); used[i] = false; } }
其实不难:设定一个used数组用来标记当前元素是否已经被访问,如果没有被访问过则进入if代码块,将当前元素填入perm数组中(perm数组是用来记录全排列元素的顺序的)并将used数组置为true,并递归调用此函数。那么问题来了,为什么要在后面加一个把used数组又重置为false呢?其实这就是dfs的回溯(相信有的小伙伴已经明白了)。比如:123下一个排列是132,为什么能产生132呢,就是因为当本次递归到出口后,又将used数组重置为false才能够继续访问2和3,先重置元素3,再重置元素2,这就是回溯。
那么到这里还没有结束,因为c++标准库为我们提供了一种更加便捷的方式(记得要加头文件algorithm):
代码:
#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;#define MAX_N 1000int perm2[MAX_N];void permutation2(int n){ for(int i = 0; i < n; i++) { perm2[i] = i; } do{ for(int i = 0; i < n; i++) printf("%d ", perm2[i]); printf("\n"); }while(next_permutation(perm2, perm2+n)); return ;}int main(){ int n; scanf("%d", &n); permutation2(n); return 0;}
结果:
是不是感觉又轻松了不少呢!
0 0
- 算法-全排列问题
- 全排列算法问题
- 算法实现-->全排列问题
- 全排列问题 递归算法
- 算法-字符串全排列问题
- 算法---全排列问题
- 时钟问题--领会全排列算法
- 【算法分析与设计】全排列问题
- 递归算法之全排列问题
- 全排列问题(递归算法) 汇总
- 算法习题53:字符串全排列问题
- 用回溯算法解决全排列问题
- [算法设计-字符的全排列问题]
- 算法问题(2)输出全排列
- 算法总结(9)--全排列问题
- 全排列算法 递归出口问题
- 字符串全排列问题(递归算法)
- 全排列问题算法实现--递归
- linux写shell注意的问题
- 远程绑定下拉
- 【NAS】Samba服务器中新建文件/目录的权限
- 关于iscroll滚动插件,在iOS下面,上拉之后无法回弹的问题
- linux 查看磁盘空间大小
- 全排列算法问题
- 谷歌推出A.I. Experiments:让任何人都可以轻松实验人工智能
- scala类型系统使用示例
- Linux常用命令大全
- Activity的启动模式
- linux网络编程之socket(八):五种I/O模型和select函数简介
- HTML标签lang=lang - 指定语言种类
- Android 开发 之 Enum (枚举) —— @IntDef的使用
- Android面试准备工作