基础算法-递归-全排列

版权声明:本文为博主原创文章,未经博主允许不得转载。如需转载,请与博主联系。 https://blog.csdn.net/qq_31790997/article/details/89397735

【小韦同学@基础算法-递归-全排列】

题目:

描述

一般把 1 ~ n 这 n 个整数按某个顺序摆放的结果称为这 n 个整数的一个排列,而全排列指这 n 个整数能形成的所有排列。
例如对于 1,2,3 这三个整数来说,(1, 2, 3)、(1, 3, 2)、(2, 1, 3)、(2, 3, 1)、(3, 1, 2)、(3, 2, 1) 就是 1 ~ 3 的全排列。

输入

输入一个正整数 n。

输出

输出 n 行,为 1 ~ n 的全排列,按照字典序排列。

输入样例

3

输出样例

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

题解:

/*********************************************************************

* 题目:基础算法-递归-全排列 
* 作者:小韦同学
* 邮箱:[email protected]

* 题解:
	思路:
	可以将此问题描述成“输出1~n这n个整数的全排列”,可以分成若干子问题,
	“输出以1开头的全排列”,“输出以2开头的全排列”,……,“输出以3开 
	头的全排列”。
	在子问题“输出以1开头的全排列”中又能分成若干子问题,“输出以2开头
	的的全排列”,“输出以3开头的全排列”,……,“输出以n开头的全排列”。
	对于每一个子问题又能分成若干子问题,直到只剩下一种选择为止。 
	
*********************************************************************/

#include <bits/stdc++.h>

using namespace std;

const int N = 110;
int n;  // 全排列的最大数 
int p[N] = {0};  // 存下全排列 
bool used[N] = {false};  // 在当次排列是否有过 

// 全排列函数,求1~n的全排列,参数为第几个位置 
void generateP(int index) {
	// 递归边界,当index为n + 1时则说明从1~n的一次全排列已完成 
	if (index == n + 1) {  
		// 输出当次全排列 
		for (int i = 1; i <= n; i++) {
			cout << p[i] << " ";
		}
		cout << endl;
		return;  // 记得返回 
	}
	// 枚举1~n,判断将当前枚举的数第index个位置是否合适 
	for (int i = 1; i <= n; i++) {
		if (!used[i]) {  // i还未在当次全排列中出现 
			// 将i放在该次全排列的第index个位置
			p[index] = i;   
			used[i] = true;  // 标记i为已使用 
			// 递归调用函数,给第index + 1个位置选数
			generateP(index + 1);   
			used[i] = false;  // 回溯 
		}
	}
}

int main() {
	
	cin >> n;  
	generateP(1);	
	
	return 0;
}

我是小韦同学,企者不立,跨者不行,每天进步一点点。
欢迎大家多多交流,如果发现有错误,请多指正。有疑问的同学也可以留言评论或者发邮件。
邮箱:[email protected]

猜你喜欢

转载自blog.csdn.net/qq_31790997/article/details/89397735