【正经题解】选排列的生成
2024-02-22 10:18:17
发布于:浙江
8阅读
0回复
0点赞
这是一个求排列的问题,要求输出从 到 的 个整数中任意取 个进行排列的所有情况。解决这个问题可以使用深度优先搜索( )的方法。
. 定义一个数组 用于存放当前排列的数字。
. 定义一个数组 用于标记数字是否被使用过。初始化为 。
. 读取输入的整数 和 ,分别代表整数的范围和取数的个数。
. 定义深度优先搜索函数 ,参数 表示当前排列的位置。
如果当前位置 等于 ,说明已经排列完毕,输出当前排列。
否则,从 到 遍历每个数字,如果该数字没有被使用过,标记为已使用,将其放入当前位置,然后递归调用 ( ) 进行下一层的搜索。最后,恢复状态,标记为未使用,以便尝试其他可能性。
. 在 函数中调用 ( )开始搜索。
#include <iostream>
using namespace std;
const int MAXN = 10001;
int a[MAXN]; // 存放当前排列的数组
bool b[MAXN]; // 标记数字是否被使用过
int n, m; // n 个整数,取 m 个数进行排列
// 深度优先搜索函数
void dfs(int t) {
if (t == m + 1) {
// 输出当前排列
for (int i = 1; i <= m; i++) {
if (i == m) {
cout << a[i];
} else {
cout << a[i] << " ";
}
}
cout << endl;
return;
}
for (int i = 1; i <= n; i++) {
if (!b[i]) {
b[i] = true;
a[t] = i;
dfs(t + 1); // 递归搜索下一层
b[i] = false; // 恢复状态,尝试其他可能性
}
}
}
int main() {
cin >> n >> m;
dfs(1); // 从第一个位置开始搜索
return 0;
}
这里空空如也
有帮助,赞一个