生成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 ...
随机推荐
- 基因组 de novo 组装原理
Falcon软件的组装流程 为了错误校正,将原始子reads进行overlap 预组装和错误校正 错误校正后reads的overlap检测 overlap的过滤 从overlap构建图 从图构建con ...
- Java Swing事件处理机制
Java Swing的事件处理机制 Swing GUI启动后,Java虚拟机就启动三个线程,分别为主线程,事件派发线程(也是事件处理线程)和系统工具包线程. 主线程 :负责创建并显示该程序的初始界面: ...
- js获取随机数
js 获取随机数方法如下: 1.Math.random()表示 结果为0-1间的一个随机数(包括0,不包括1) : 返回指定范围的随机数(m-n之间)的公式 Math.random()*(n-m)+m ...
- SharePoint Web service and template
SharePoint Web service对应的映射列表 WSS Web Services Web Reference Administration Service http://<s ...
- python读取指定内存的内容
import ctypes as ct t = ct.string_at(0x211000, 20) # (addr, size) print t 最好不要用解释性语言来开发底层,一般用C.
- hduoj------2594 Simpsons’ Hidden Talents
Simpsons’ Hidden Talents Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- Bag of mice(CodeForces 148D )
D. Bag of mice time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- Jquery异步提交$.ajax的使用
function test(){ var myEntity=new Object(); myEntity.pro1="xxx"; myEntity.pro2=10; $.ajax( ...
- OkHttp使用全解析(转)。
Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient.关于HttpURLConnection和HttpClient的选择>>官方博客尽管Go ...
- Android第三方开源对话消息提示框:SweetAlertDialog(sweet-alert-dialog)
Android第三方开源对话消息提示框:SweetAlertDialog(sweet-alert-dialog) Android第三方开源对话消息提示框:SweetAlertDialog(sweet- ...