输入正整数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的全排列的更多相关文章

  1. 生成n个数的全排列【递归、回溯】

    下面讨论的是n个互不相同的数形成的不同排列的个数.毕竟,假如n个数当中有相同的数,那n!种排列当中肯定会有一些排列是重复的,这样就是一个不一样的问题了. /*===================== ...

  2. STL next_permutation(a,a+n) 生成一个序列的全排列。满足可重集。

    /** 题目: 链接: 题意: 思路: */ #include <iostream> #include <cstdio> #include <vector> #in ...

  3. 字符串全排列(permutation)

    Reference: http://www.cnblogs.com/sujz/archive/2011/06/16/2082831.html 问题:给定字符串S,生成该字符串的全排列. 方法1:依次从 ...

  4. [2017BUAA软工]第一次个人项目 数独的生成与求解

    零.Github链接 https://github.com/xxr5566833/sudo 一.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分 ...

  5. C语言程序设计100例之(31):全排列问题

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

  6. LeetCode46 回溯算法求全排列,这次是真全排列

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode的26篇文章,我们来实战一下全排列问题. 在之前的文章当中,我们讲过八皇后.回溯法,也提到了全排列,但是毕竟没有真正写 ...

  7. 递归实现1-n的全排列(JAVA语言)

    思路: For example: 123的全排列= 1在最前面 23的全排列 + 2在最前面 13的全排列 + 3最前面 12的全排列 所以只需交换和最前面元素的位置,生成剩余元素的全排列即可. im ...

  8. poj 1731 Orders

    http://poj.org/problem?id=1731 Orders Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9 ...

  9. POJ-3187 Backward Digit Sums (暴力枚举)

    http://poj.org/problem?id=3187 给定一个个数n和sum,让你求原始序列,如果有多个输出字典序最小的. 暴力枚举题,枚举生成的每一个全排列,符合即退出. dfs版: #in ...

随机推荐

  1. jQuery 请指出'.bind()','.live()'和'.delegate()'的区别

    http://kb.cnblogs.com/page/94469/网上好多类似的 简言之bind可以绑定页面上已有的,live和delegate可以绑定到还未存在于页面中的元素之上.delegate又 ...

  2. github如何pull最新代码

      github现在已经经常用了,但是经常遇到下面的问题 比如:从一个项目A中fork了一个分支B,并且在分支B有了改动.过了几天后,项目A中的代码应该会有很多人提交修改了,现在想将最新的代码pull ...

  3. 杂记(编程style)----google code style!

    1.文件名 使用小写字母和下划线组合.头文件以.h结尾,定义文件用.cc结尾.例如:my_useful_class.cc 2.类型名 使用大写字母开头,多个单词组合时每个单词的首字母大写.例如:Url ...

  4. hdu----(1466)计算直线的交点数(dp)

    计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  5. 超详细的Xcode代码格式化教程,可自定义样式。

    超详细的Xcode代码格式化教程,可自定义样式. 为什么要格式化代码 当团队内有多人开发的时候,每个人写的代码格式都有自己的喜好,也可能会忙着写代码而忽略了格式的问题.在之前,我们可能会写完代码后,再 ...

  6. Extjs jar包问题

    当前使用struts2.23版本,使用用了jsonplugin-0.3x.jar报: com.opensymphony.xwork2.util.TextUtils错. json-lib-2.x.jar ...

  7. BZOJ3057 圣主的考验

    Poetize11的T3 DP神优化= =反正蒟蒻不会 Orz ZYF竟然找到了题解,反正我是没找到T T(百度空间:你太沙茶了,不给你看题解2333) 然后就对着标程写了一遍,然后T了...233 ...

  8. Singleton、MultiThread、Lib——实现单实例无锁多线程安全API

        前阵子写静态lib导出单实例多线程安全API时,出现了CRITICAL_SECTION初始化太晚的问题,之后查看了错误的资料,引导向了错误的理解,以至于今天凌晨看到另一份代码,也不多想的以为s ...

  9. linux copy

    cp -ri 131115-6/* /web/www/attachment/  把13这个文件夹下面所有的文件和文件夹复制到 /web/www/attachment cp -a  a  /web/ww ...

  10. Android Webview 背景透明

    两个关键点: 1         fBarParams.format = PixelFormat.RGBA_8888; 2 mWebView.setBackgroundColor(Color.TRAN ...