全排列
Description
从 n 个不同元素中任取 m(m ≤ n) 个元素,按照一定的顺序排列起来,叫做从 n 个不同元素中取出 m 个元素的一个排列。当 m=n 时所有的排列情况叫全排列。今天这道题目很简单就是给你一个整数 n ,计算 [1,n] 所有数字的排列组合。
Input
第一行输入一个整数 n ( 1 ≤ n ≤ 10).
Output
第一行输出一个全排列的方案总数 m。接下来按照字典序依次输出这 m 个排列。排列的字典的比较方法和字符串一样,比如两个排列 a,b,从第一个数开始,找到第一个不同的数的位置为 i,然后比较 a[i] 和 b[i] 的大小,如果 a[i] 小的,那么 a 的字典序就小,否则 b 的字典序更小。
Sample Input 1
2
Sample Output 1
2
12
21
Sample Input 2
3
Sample Output 2
6
123
132
213
231
312
321
——摘自YCOJ
看到这道题,你想到了什么?
一道DFS的实现。简单的说,用DFS搜索出n的全部排列组合,统计方案数,就是这道题的答案。
一起提到过DFS的基本思想。深度优先搜索按照深度优先的方式进行搜索,注意,这里的“搜索”不是指的我们平时在文件中或者在网络上查找某些信息,搜索是一种穷举的方式,把所有可行的方案都列出来,不断去尝试,直到找到问题的答案。
在我的理解中,搜索被分为两大类,一种是在图上进行的搜索,例如踏青还有一种是,不在图上的搜索,例如组合+判断素数 ,N皇后等。而全排列是典型的第二种。
这道题,我们只需不断的搜出方案数统计并累计输出,就可以了。
#include<bits/stdc++.h>
using namespace std;
int a[1010],v[1010];
int n,m=0;
int b[1000000][100];
void dfs(int k){
if(k == n+1){
m++;
for(int i=1;i<=n;i++){
b[m][i] = a[i];
}
}else{
for(int i=1;i<=n;i++)
if(v[i] == 1){
v[i] = 0;
a[k] = i;
dfs(k+1);
a[k] = 0;
v[i] = 1;
}
}
}
int main(){
cin >> n;
for(int i=1;i<=n;i++){
v[i] = 1;
}
dfs(1);
cout << m << endl;
for(int i = 1;i<=m;i++){
for(int j=1;j<=n;j++){
cout << b[i][j];
}
cout << endl;
}
return 0;
}
——END——