用回溯算法实现全排列

题目:
给出一个数组,将这个数组的所有排列方式打印出来

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时枚举就会变得十分困难,因此,回溯算法就成了减少运行时间的一个有力工具,要好好理解。

posted @ 2025-07-29 19:57  暗神酱  阅读(6)  评论(0)    收藏  举报