swap(x[i],x[j]) ....... swap(x[i],x[j]) 如何实现回溯。请画图佐证。
时间: 2023-12-26 11:06:31 浏览: 21
回溯是指在搜索过程中,如果当前的搜索方案不可行,就要回退到上一个状态,重新选择方案。在使用 `swap(x[i], x[j])` 进行全排列等搜索问题时,回溯就是将交换过的两个元素再交换一次,回到原来的状态。
以下是一个示例代码:
```cpp
void backtrack(vector<int>& nums, int start, vector<vector<int>>& res) {
if (start == nums.size()) {
res.push_back(nums);
return;
}
for (int i = start; i < nums.size(); i++) {
swap(nums[start], nums[i]);
backtrack(nums, start + 1, res);
swap(nums[start], nums[i]); // 回溯
}
}
```
例如,对于输入 `[1, 2, 3]`,在交换了 1 和 2 后,进入下一层递归:
```
start=1: [1, 2, 3]
start=2: [1, 2, 3]
start=3: [1, 2, 3] // 到达最后一层,将当前排列加入结果
swap(2, 2)
start=2: [1, 3, 2]
start=3: [1, 3, 2] // 到达最后一层,将当前排列加入结果
swap(2, 2)
swap(1, 1)
start=1: [2, 1, 3]
start=2: [2, 1, 3]
start=3: [2, 1, 3] // 到达最后一层,将当前排列加入结果
swap(2, 2)
start=2: [2, 3, 1]
start=3: [2, 3, 1] // 到达最后一层,将当前排列加入结果
swap(2, 2)
swap(1, 1)
start=1: [3, 2, 1]
start=2: [3, 2, 1]
start=3: [3, 2, 1] // 到达最后一层,将当前排列加入结果
swap(2, 2)
start=2: [3, 1, 2]
start=3: [3, 1, 2] // 到达最后一层,将当前排列加入结果
swap(2, 2)
swap(1, 1)
```
可以看到,在交换了 1 和 2 后,需要再交换一次才能回到原来的状态。这就是回溯的过程。