输出排列 递归、回溯法
前缀List[0…k-1], 后缀为list[k..m]
(没有前缀)从第0个元素开始,起始位置list[0] 与list[0…n-1] 这N个元素交换位置,确定第0位的元素
前缀list[0] 后缀为list[1…n-1] ,将list[1]这个元素与list[2…n-1] 交换位置
类推直到,后缀为list[n-1]的时候输出
递推会改变原有的排列顺序,我们需要运用回溯法,
#include<iostream> using namespace std; int n; template<class T> inline void Swap(T &a,T &b){ T temp=a; a=b; b=temp; } template<class T> void Perm(T list[],T k,T m){ //生成list[k...m]的所有排列方式 int i; if(k==m){ for(int i=0;i<=m;i++) cout<<list[i]; cout<<endl; } else //list[k..m]多种排列方式 { for(i=k;i<=m;i++){ swap(list[k],list[i]); Perm(list,k+1,m); Swap(list[k],list[i]);//还原保证list的完整性 } } } int main() { // int n; while(cin>>n) { int a[n]; for(int i=0;i<n;i++) cin>>a[i]; Perm(a,0,n-1); } }
View Code