输出n个正整数的全排列

点击查看代码
/*输出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;
}

posted @ 2022-09-27 22:48  zhaoo_o  阅读(28)  评论(0编辑  收藏  举报