全排列打表原理:
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; }