前綴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);
}
}
原文出處:https://www.cnblogs.com/helloworld2019/p/10348756.html