题目:
给出一个数组,将这个数组的所有排列方式打印出来
include<bits/stdc++.h>
void swap(int& a, int& b) {
int temp = a; a = b;
b = temp;
}
// 生成全排列
void permute(int* nums, int start, int n) {
if (start == n) { // 当起始位置等于数组长度时,输出当前排列
for (int i = 0; i < n; ++i) {
cout << nums[i];
if (i < n - 1) cout << ", ";
}
cout << endl;
return;
}
// 固定当前位置,递归生成剩余部分的排列
for (int i = start; i < n; ++i) {swap(nums[start], nums[i]); // 选择第i个元素作为当前位置permute(nums, start + 1, n); // 递归生成剩余部分的排列swap(nums[start], nums[i]); // 回溯,恢复原数组顺序
}
}
int main() {
int nums[] = { 1, 2, 3 };
int n = sizeof(nums) / sizeof(nums[0]);
cout << "全排列结果:" << endl;
permute(nums, 0, n);return 0;
}
输出案例:
全排列结果:
1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 1
3, 2, 1
3, 1, 2
这个回溯的巧妙之处在于利用了一个整型数据start来控制交换的位置,同时减少循环次数,这个思路非常不好想,虽然可以直接用三层for循环暴力枚举,但是当n>4时枚举就会变得十分困难,因此,回溯算法就成了减少运行时间的一个有力工具,要好好理解。