思路:
- 对于给定的集合,选择一个元素作为当前位置的元素。
- 将当前位置的元素与集合中其他位置的元素交换,依次产生新的排列。
- 通过递归调用,将当前位置向后移动,继续生成新的排列。
- 当当前位置达到集合的末尾时,表示生成了一个完整的排列,将其保存下来。
示例:
1 2 3
1
1 3 2
2 1 3
2
2 3 1
3 1 2
3
3 2 1
树状图:
代码:
#include <iostream>
using namespace std;
// 深度优先搜索函数,用于生成排列
void dfs(int a[], int n, int i) {
// 当 i 等于 n 时,说明已经排列完毕,输出当前排列
if (i == n) {
for (int i = 0; i < n; i++)
cout << a[i];
cout << endl;
return;
}
// 对于第 i 位,可以选择 a[i] 到 a[n-1] 中任意一个数进行交换
for (int j = i; j < n; j++) {
// 交换 a[i] 和 a[j]
swap(a[i], a[j]);
// 对于下一位递归,i 值加 1,继续排列下一个数
dfs(a, n, i + 1);
// 恢复数组 a,进行下一轮交换
swap(a[i], a[j]);
}
}
int main() {
int a[] = {1, 2, 3};
dfs(a, 3, 0); // 从第 0 位开始排列
return 0;
}