回溯算法

回溯算法C++实现详解

一、回溯算法概述

什么是回溯算法

回溯算法是一种通过探索所有可能的候选解来找出所有解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化来丢弃该解,即"回溯"并尝试其他可能的解。

核心思想

  • 路径:已经做出的选择
  • 选择列表:当前可以做的选择
  • 结束条件:到达决策树底层,无法再做选择

算法模板

#include <vector>
#include <string>
#include <iostream>
using namespace std;

// 回溯算法模板
void backtrack(路径, 选择列表) {
    if (满足结束条件) {
        收集结果;
        return;
    }
    
    for (选择 : 选择列表) {
        做选择;
        backtrack(路径, 选择列表);
        撤销选择;
    }
}
  1. 全排列问题
    问题描述:给定一个不含重复数字的数组 nums,返回其所有可能的全排列。

思路:使用used数组标记已使用的元素,每次从未使用的元素中选择一个加入路径。

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    
    void backtrack(vector<int>& nums, vector<bool>& used) {
        if (path.size() == nums.size()) {
            result.push_back(path);
            return;
        }
        for (int i = 0; i < nums.size(); i++) {
            if (used[i]) continue;
            used[i] = true;
            path.push_back(nums[i]);
            backtrack(nums, used);
            used[i] = false;
            path.pop_back();
        }
    }
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<bool> used(nums.size(), false);
        backtrack(nums, used);
        return result;
    }
};
posted @ 2026-06-30 16:59  十七code  阅读(3)  评论(0)    收藏  举报