输入正整数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. VB6 GDI+ 入门教程[3] 笔、刷子、矩形、椭圆绘制

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[3] 笔.刷子.矩形.椭圆绘制 2009 年 6 月 1 ...

  2. 如何设计一个RPC系统

    版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qclou ...

  3. AndroidManifest.xml清单文件要点

    AndroidManifest.xml AndroidManifest.xml清单文件通常包括如下内容: 应用程序的包名,该包名作为该应用的唯一标识. 应用包含的组件,如Activity,Servic ...

  4. 纯css3代码写无缝滚动效果

    主要用到css3中的动画 @keyframes, animation. 布局是外层一个div宽固定,然后overflow hidden 绝对定位,里面的ul 固定定位.通过对ul添加动画来实现效果.具 ...

  5. Ubuntu配置Open BlockChain

    /* 以前只是听说过BlockChain,没怎么了解过,最近导师在搞Blockchain,让我配一下Open BlockChain的环境,于是就硬着头皮配了一下,还挺顺利的. 由于没接触过BlockC ...

  6. NetworkShareAccesser: 远程PC1 文件 copy 到PC2 文件夹

    Usage: string strRepoBundlePath = @"\\at1-repo01\ATE\Bundles\SharePoint\Open\denyopen.zip" ...

  7. zju 1091

    // Traveling Knight Problem #include "stdafx.h" #include <string> #include <strin ...

  8. JAVA类与对象作业——动手动脑以及课后实验性问题

    一: 1.源代码 //MAO2015.10.6 //foo class Foo { int value; public Foo(int initValue) { value = initValue; ...

  9. discuz核心函数库function_core的函数注释

    /** * 系统错误处理 * @param <type> $message 错误信息 * @param <type> $show 是否显示信息 * @param <typ ...

  10. spring集成环境下的axis webservice的发布,调试

    在spring集成的环境下,无论你是ssh集成,还是ssi集成的情况下,发布webservice往往在调用的时候会出错. 特别是,如果你是这个方式: 将webservice打aar包,放到tomcat ...