leetcode51.N皇后
Posted Joker1937
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode51.N皇后相关的知识,希望对你有一定的参考价值。
一道典型的回溯问题,回溯法的框架如下:
result = [] def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列表) 撤销选择
函数 backtrack 依然像个在决策树上游走的指针,通过 row 和 col 就可以表示函数遍历到的位置,通过 isValid 函数可以将不符合条件的情况剪枝。据此写出如下代码:
class Solution { vector<vector<string>> res; public: vector<vector<string>> solveNQueens(int n) { vector<string> board(n, string(n, ‘.‘)); backtrack(board, 0); return res; } void backtrack(vector<string>& board, int row) { //结束条件 if(row == board.size()) { res.push_back(board); return; } for(int col = 0; col < board[0].size(); ++col) { //排除不合法的选择 if(!isValid(board, row, col)) continue; // 做选择 board[row][col] = ‘Q‘; // 下一步决策 backtrack(board, row + 1); // 撤销选择 board[row][col] = ‘.‘; } } // 是否可以在board[row][col]放置皇后 bool isValid(vector<string>& board, int row, int col) { // 同一列有无其他皇后 for(int i = 0; i < board.size(); ++i) { if(board[i][col] == ‘Q‘) return false; } // 右上方有无其他皇后 for(int i = row-1, j = col+1; i >= 0 && j < board.size(); --i, ++j) { if(board[i][j] == ‘Q‘) return false; } // 左上方有无其他皇后 for(int i = row-1, j = col-1; i >= 0 && j >= 0; --i, --j) { if(board[i][j] == ‘Q‘) return false; } return true; } };
有的时候,我们并不想得到所有合法的答案,只想要一个答案,怎么办呢?比如解数独的算法,找所有解法复杂度太高,只要找到一种解法就可以。
其实特别简单,只要稍微修改一下回溯算法的代码即可:(将返回值改为bool,一旦找到解立即返回)
// 函数找到一个答案后就返回 true bool backtrack(vector<string>& board, int row) { // 触发结束条件 if (row == board.size()) { res.push_back(board); return true; } ... for (int col = 0; col < n; col++) { ... board[row][col] = ‘Q‘; if (backtrack(board, row + 1)) return true; board[row][col] = ‘.‘; } return false; }
参考链接:https://leetcode-cn.com/problems/n-queens/solution/hui-su-suan-fa-xiang-jie-by-labuladong/
以上是关于leetcode51.N皇后的主要内容,如果未能解决你的问题,请参考以下文章