生成1~n的全排列
输入正整数n,输出n的全排列。
样例输入1:
3
样例输出1:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
分析:
按字典序从小到大的顺序输出所有的排列。
(字典序:两个序列的字典序大小关系等价于从头开始第一个不相同位置处的大小关系)
使用数组a保存排列中的数,集合s代表剩下的数。
则有
方法1:
1.伪代码:
int dfs(a,s,cur){//找到排列中的第cur个数字。
If (s==空) 输出这个排列;
else
取集合s中的元素i;
a[cur]=i ;//存到a数组中
dfs(a,s,cur+1);
}
s集合可以省掉,直接用a来表示,如果i在a[1]~a[cur-1]中存在,则说明i已经使用,否则说明i在集合s中。
因为要从第一个数字开始找,所以首先调用dfs(1) //cur=1
源代码:
#include<cstring>
using namespace std;
int a[100],s, n;;
void dfs(int cur){//函数没有返回值,所以类型为void
if (cur==n+1) {
for (int i=1;i<n;i++) cout<<a[i]<<" ";
cout<<a[n]<<endl;
s++;
}
else for (int i=1;i<=n;i++){
int ok=1;
for(int j=1;j<cur;j++) //因为当前找第cur个数字,所以和前面已经找到的cur-1个数字比较
if(a[j]==i) ok=0;
if (ok){ a[cur]=i ;dfs(cur+1);}
}
}
int main(){
memset(a,0,sizeof(a));
cin>>n;
dfs(1);
cout<<s<<endl;
return 0;
}
思考:
(1)全局变量与局部变量;
比如a数组和变量n,s在main和dfs中都要用到,所以定义为全局变量,cur只在当前调用的函数中使用,所以定义为局部变量。
(2)函数没有返回值时如何处理。
函数没有返回值时,函数类型为void,可以没有return语句,也可以有,但其后没有表达式
return ;
2.
伪代码:
int dfs(cur){//已经找到cur个数字,准备找下一个。
If (s==空) 输出这个排列;
else
取集合s中的元素i;
a[cur+1]=i ;//存到a数组中
dfs(cur+1);
}
初始时已经找到了0个数字,所以首先调用dfs(0)
#include<iostream>
#include<cstring>
using namespace std;
int a[],s=, n;
void dfs(int cur){//函数没有返回值时类型为void
if (cur==n) {
for (int i=;i<n;i++) cout<<a[i]<<" ";
cout<<a[n]<<endl;
s++;
}
else
for (int i=;i<=n;i++){
int ok=;
for(int j=;j<=cur;j++)
if(a[j]==i) ok=;
if (ok){
a[cur+]=i;
dfs(cur+);
}
}
}
//使用标记数组
#include<iostream>
#include<cstdio>
using namespace std;
int a[],f[] ;
int n;
void dfs(int cur){
if (cur==n) {
for (int i=;i<n;i++) printf("%d ",a[i]);
printf("%d\n",a[n]);
return ;
}
for (int i=;i<=n;i++)
if (!f[i]){
a[cur+]=i;
f[i]=; //标记i已经使用
dfs(cur+);
f[i]=; }
}
int main(){
scanf("%d",&n);
for (int i=;i<=n;i++) f[i]=;//f初值为0
dfs();
return ;
}


#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[],p[] ;
int n;
int main(){
cin>>n;
for (int i=;i<=n;i++) a[i]=i;//初值为最小的字母表顺序
do{
for (int i=;i<n;i++) printf("%d ",a[i]);
printf("%d\n",a[n]);
}while (next_permutation(a+,a+n+));
return ;
}
参考网址:http://codevs.cn/problem/1294/
该题目卡cin,cout(第五个点过不了),使用scanf和printf就没有问题了。
生成1~n的全排列的更多相关文章
- 生成n个数的全排列【递归、回溯】
下面讨论的是n个互不相同的数形成的不同排列的个数.毕竟,假如n个数当中有相同的数,那n!种排列当中肯定会有一些排列是重复的,这样就是一个不一样的问题了. /*===================== ...
- STL next_permutation(a,a+n) 生成一个序列的全排列。满足可重集。
/** 题目: 链接: 题意: 思路: */ #include <iostream> #include <cstdio> #include <vector> #in ...
- 字符串全排列(permutation)
Reference: http://www.cnblogs.com/sujz/archive/2011/06/16/2082831.html 问题:给定字符串S,生成该字符串的全排列. 方法1:依次从 ...
- [2017BUAA软工]第一次个人项目 数独的生成与求解
零.Github链接 https://github.com/xxr5566833/sudo 一.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分 ...
- C语言程序设计100例之(31):全排列问题
例31 全排列问题 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入格式 n(1≤n≤9) 输出格式 由1-n组成的所有不重复的数字 ...
- LeetCode46 回溯算法求全排列,这次是真全排列
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode的26篇文章,我们来实战一下全排列问题. 在之前的文章当中,我们讲过八皇后.回溯法,也提到了全排列,但是毕竟没有真正写 ...
- 递归实现1-n的全排列(JAVA语言)
思路: For example: 123的全排列= 1在最前面 23的全排列 + 2在最前面 13的全排列 + 3最前面 12的全排列 所以只需交换和最前面元素的位置,生成剩余元素的全排列即可. im ...
- poj 1731 Orders
http://poj.org/problem?id=1731 Orders Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9 ...
- POJ-3187 Backward Digit Sums (暴力枚举)
http://poj.org/problem?id=3187 给定一个个数n和sum,让你求原始序列,如果有多个输出字典序最小的. 暴力枚举题,枚举生成的每一个全排列,符合即退出. dfs版: #in ...
随机推荐
- C# 中的弱引用 WeakReference
C#中的弱引用(WeakReference) 我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的.我们能不能同时保持对对象的引用,而又可以让GC需要的时候回收这个对象呢?.NET ...
- xcode6 framework missing submodule xxx 警告
xcode6 framework missing submodule xxx 警告 从xcode6开始,iOS可以直接创建生成framework了 如: 创建 framework 项目,TFKit.f ...
- React Native For Android 架构初探
版权声明:本文由王少鸣原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/171 来源:腾云阁 https://www.qclo ...
- requestAnimationFrame在Chrome里的实现
requestAnimationFrame是HTML5游戏和动画必不可少的函数,相对于setTimeout或setInterval它有两个优势,一是它注册的回调函数与浏览器的渲染同步,不用担心Time ...
- js 中 continue 与 break 熟练使用
//break:在循环体中,遇到break,整个循环都结束了,后面的累加操作也不在执行了,并且循环体中,只要遇到break,那么循环体break后面的代码都不在执行了 //continue:在循环体中 ...
- License Manager 10.3启动失败解决方法
参考:http://jingyan.baidu.com/article/c275f6bac8763ae33d756788.html 安装ARCGIS10.3过程中无法启动license. 解决办法: ...
- easyui $.parser.parse 页面重新渲染
一些dom元素是动态拼接上的easui的样式,由于页面已经渲染过了,所以需要手动执行渲染某个部件或者整个页面 $.parser.parse(); // parse all the page $.par ...
- long long 与 _int64
本文讨论的是五种常用的C/C++编译器对64位整型的支持,这五种编译器分别是gcc(mingw32),g++(mingw32),gcc(linux i386),g++(linux i386),Micr ...
- 318. Maximum Product of Word Lengths ——本质:英文单词中字符是否出现可以用26bit的整数表示
Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...
- Servlet容器如何同时来处理多个请求
工作者线程Work Thread:执行代码的一组线程调度线程Dispatcher Thread:每个线程都具有分配给它的线程优先级,线程是根据优先级调度执行的Servlet采用多线程来处理多个请求同时 ...