输入正整数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. xUtils更新到3.0后的基本使用规则

    说实话,对于xUtils,是我最近才用到的开发框架(也是刚接触),对于其功能不得不说,简化了很多的开发步骤,可以说是非常好的开发工具,但是其最近更新到3.0也没有解决加载自定义ImageView报错的 ...

  2. Selenium Grid Configuration

    Start Hub and Node with Json config 1. Start Hub with json config file title HubWebDriver java -jar ...

  3. java写的简单通用线程池demo

    首先声明,代码部分来自网络. 1.入口DabianTest: package com.lbh.myThreadPool; import java.util.ArrayList; import java ...

  4. javascript之with的使用 弊端

    妹的,昨天都快写完了,一不小心点了个关闭,然后...就没有然后了 wordpress的自动保存功能咋就这么不靠谱呢 记得还在懵懂学习JavaScript基础之时,坊间便有传言“with语句是低效率语句 ...

  5. java synchronized静态同步方法与非静态同步方法,同步语句块

    摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方 ...

  6. javaSE基础之基本细节注解

    1.  对于多行注释而言,不能进行嵌套注释.....! /* dada /* d adasdas */ */ 只是不被允许的.... 2.对于记事本编程......如果竹类是公有类,则必须保证类名和为 ...

  7. IOS-错误总结

    1,警告:"xoxoxoxo"  is deprecated解决办法:查看xoxoxoxo的这个方法的文档,替换掉这个方法即可.2,警告:Declaration of " ...

  8. C++文件读写练习

    编写一个程序,统计data.txt文件的行数,并将所有行前加上行号后写到data1.txt文件中. 算法提示: 行与行之间以回车符分隔,而getline()函数以回车符作为终止符.因此,可以采用get ...

  9. 454. 4Sum II ——查找本质:hash最快,二分次之

    Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such t ...

  10. PMP 项目管理

    1.什么是项目管理   项目管理就是把各种知识,技能,工具,技术应用于项目活动,来满足项目的需求.这个是从技术方面来说的.其实在项目管理的技术 层面背后,还有理念层面的内容.学习项目管理,除了学习技术 ...