- code:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- /*
- (1)n 个元素的全排列 =(n-1 个元素的全排列)+(另一个元素作为前缀);
- (2) 出口: 如果递归到只有一个元素的全排列, 则说明已经排完, 则输出数组;
- (3) 不断将每个元素放作第一个元素, 然后将这个元素作为前缀, 并将其余元素继续全排列, 等到出口, 出口出去后还需要还原数组;
- */
- const int maxn = 1e5+10;
- int a[maxn],n;
- void dfs(int b[],int k){
- if(k==n){
- for(int i=1;i<=n;i++){
- printf("%d",b[i]);
- }
- printf("\n");
- return ;
- }
- for(int i=k;i<=n;i++){
- swap(a[i],a[k]);
- dfs(a,k+1);
- swap(a[i],a[k]);
- }
- }
- int main(){
- scanf("%d",&n);
- for(int i=1;i<=n;i++) a[i] = i;
- dfs(a,1);
- return 0;
- }
关于 STL 中打印全排列表的使用:
有关全排列函数: next_permutation(iterator start,iterator end), 和 prev_permutation(iterator start,iterator end);
这两个函数作用是一样的, 区别就在于前者求的是当前排列的下一个字典序排列, 后一个求的是当前排列的上一个字典序排列 是否存在.
进行自定义全排列 next_permutation(node,node+n,cmp)
next_permutation(num,num+n) 函数是对数组 num 中的前 n 个元素进行全排列
- #include <stdio.h>
- #include <algorithm>
- using namespace std;
- int main(){
- int n;
- while(scanf("%d",&n)&&n){
- int a[1000];
- for(int i=0;i<n;i++){
- scanf("%d",&a[i]);
- }
- sort(a,a+n);
- do{
- for(int i=0;i<n;i++)
- printf("%d",a[i]);
- printf("\n");
- }while(next_permutation(a,a+n));
- }
- return 0;
- }
全排列打表
来源: http://www.bubuko.com/infodetail-3217076.html