21xrx.com
2024-11-05 16:29:39 Tuesday
登录
文章检索 我的文章 写文章
【教程分享】回溯法c++代码
2023-07-11 01:59:33 深夜i     --     --
回溯法 C++ 代码 算法 解决问题

回溯法(Backtracking)是一种算法思想,通常用于解决一些组合优化问题,如8皇后问题、0/1背包问题等。回溯法的基本思想是从问题的某一个状态(初始状态)开始搜索,调用函数为了求解问题而开始搜索,当搜索到某一状态时,判断这个状态是否合法,若合法则继续搜索子状态;若该状态不合法,则返回上一状态继续搜索其他的子状态,这个过程就是回溯。下面将介绍回溯法的c++代码实现。

首先,需要设计一个函数用来判断当前状态是否合法,如下所示:

bool isValid(vector & nums, int row, int col) {

  for (int i = 0; i < row; i++) { // 检查同一列

    if (nums[i] == col)

      return false;

  }

  for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { // 检查左上方

    if (nums[i] == j)

      return false;

  }

  for (int i = row - 1, j = col + 1; i >= 0 && j < nums.size(); i--, j++) { // 检查右上方

    if (nums[i] == j)

      return false;

  }

  return true;

}

接着,需要实现一个回溯函数,用于搜索和判断状态。这个函数会对所有可能出现的状态进行遍历,如下所示:

void backtrack(vector >& res, vector & nums, int row, int n) {

  if (row == nums.size()) { // 所有皇后都已经放置

    vector board(n, string(n, '.'));

    for (int i = 0; i < n; i++) {

      board[i][nums[i]] = 'Q'; // 根据nums数组中的数字确定Q的位置

    }

    res.push_back(board); // 存储结果

    return;

  }

  for (int col = 0; col < n; col++) { // 依次放置皇后

    if (isValid(nums, row, col)) { // 判断当前状态是否合法

      nums[row] = col; // 记录当前状态中皇后的位置

      backtrack(res, nums, row + 1, n); // 继续搜索下一行

      nums[row] = -1; // 回溯到上一个状态

    }

  }

}

最后,需要在主函数中调用回溯函数,循环搜索所有可能的结果,并输出最后的结果。如下所示:

vector > solveNQueens(int n) {

  vector > res; // 存储所有的结果

  vector nums(n, -1); // 存储每行皇后的位置

  backtrack(res, nums, 0, n);

  return res;

}

以上是回溯法的c++代码实现,通过以上代码,我们可以解决一些组合优化问题。回溯算法实现难度适中,需要多多练习才能掌握。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复