点击查看代码
/*输出n个正整数的全排列*/
#include<cstdio>
#pragma warning(disable:4996) //允许使用scanf和printf
const int maxn = 11; //待排序序列最多11个元素
//P[]为当前排列,HashTable[x]记录整数x是否已经存入P[]中,如果是则为true
int n, P[maxn], HashTable[maxn] = { false };
//处理当前排列的第index位
void generateP(int index) {
if (index == n + 1) { //递归边界,排列的1~n位已经处理完,可以输出
for (int i = 1; i <= n; i++) {
printf("%d", P[i]); //输出当前排列
}
printf("\n");
return;
}
//枚举1~n,将x存入P[index]中
for (int x = 1; x <= n; x++) {
//如果x还没存入P[0]~P[index-1]中,则本轮可以将x存入
if (HashTable[x] == false) {
P[index] = x; //将x存入P[index]中
HashTable[x] = true; //x已在P[]中
generateP(index + 1); //处理当前排列的第index+1位
HashTable[x] = false; //已经处理完P[index]为x的子问题,HashTable[x]要还原为false
} //留作下次使用
}
}
int main() {
n = 3; //输出1、2、3这3个整数的全排列
generateP(1); //从P[1]开始填充数字
return 0;
}