思路:
- 对于给定的集合,选择一个元素作为当前位置的元素。
- 将当前位置的元素与集合中其他位置的元素交换,依次产生新的排列。
- 通过递归调用,将当前位置向后移动,继续生成新的排列。
- 当当前位置达到集合的末尾时,表示生成了一个完整的排列,将其保存下来。
示例:
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;
}