全排列问题

题目要求

题目描述

给定一个正整数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;
}

 

posted @ 2022-04-04 18:47  第厘  阅读(35)  评论(0编辑  收藏  举报