全排列问题
题目要求
题目描述
给定一个正整数n,假设序列S=[1,2,3,…,n],求S的全排列。
输入描述
一个正整数n(1≤n≤8)。
输出描述
每个全排列一行,输出所有全排列。
输出顺序为:两个全排列A和B,若满足前k−1项对应相同,但有Ak<Bk,那么将全排列A优先输出(例如[1,2,3]比[1,3,2]优先输出)。
在输出时,全排列中的每个数之间用一个空格隔开,行末不允许有多余的空格。不允许出现相同的全排列。
样例
输入
3
输出
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
代码
#include<iostream>
using namespace std;
const int maxn= 100;
int n;
int P[maxn];
int hashtable[maxn]={0};
void generateP(int index){
if(index==n+1){ //已经是递归边界
for(int i=1;i<index;i++){
if(i<index-1){
cout<<P[i]<<" "; //输出当前排列
} else{
cout<<P[i];
}
}
cout<<endl;
return ;
}
//未到递归边界
for(int x=1;x<=n;x++){ //枚举1-n,试图将x填入P[index]
if(hashtable[x]==0){
P[index]=x;
hashtable[x]=1;
generateP(index+1);
hashtable[x]=0;
}
}
}
int main(){
cin>>n;
generateP(1);
return 0;
}