版权声明:本文为博主原创文章,未经博主允许不得转载。如需转载,请与博主联系。 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]