全排列算法C++实现

//摘自算法笔记
#include<iostream>
using namespace std;
const int maxn=11;
int n,P[maxn],hashTable[maxn]={false};
void generateP(int index){
	if(index==n+1){//递归边界,已经处理完排列1~n位了
		//可以输出了
		for(int i=1;i<=n;i++){
			cout<<P[i];
		}
		cout<<endl;
		return;
	}

	for(int x=1;x<=n;x++){ //枚举1~n 试图将x填入P[index] 每次都从小到大枚举所有数字
		if(hashTable[x]==false){//如果x不在P[0]~P[index-1]中(前index-1已经填好了)
			P[index]=x;	//将x填入P中 也即是index位
			hashTable[x]=true; //记x在P中
			generateP(index+1); //处理排列的第index+1号位
			hashTable[x]=false; //已经处理完P[index]为x的子问题,还原状态,让第index位填其他数字前要先将此x放开,否则没机会了
		}
	}
}

int main(){
	while(cin>>n){
		generateP(1);//从1开始填
	}
	return 0;
}
//C++全排列函数
/*#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int num[3]={1,2,3};
    do
    {
        cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;
    }while(next_permutation(num,num+3));
    return 0;
}*/












发布了74 篇原创文章 · 获赞 27 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_37507976/article/details/93916698