Leetcode刷题笔记题解(C++):51. N皇后

Leetcode刷题笔记题解(C++):51. N皇后_第1张图片

Leetcode刷题笔记题解(C++):51. N皇后_第2张图片

思路:递归回溯

符合规则:左上方(斜),上方(列),右上方(斜)都没有放置Q

从第一行找位置,在第一行中遍历找位置,如果符合要求则放置皇后进入到下一行或者不放皇后看下一个位置

如果最后行数=要求的n,则得到结果,大概思路图:(4皇后为例)

看图大概能看懂的吧,几乎把每一种结果都试了,最后行数=n的话则为结果,剪枝的条件是符合上面那个规则

 

代码如下:

class Solution {
public:
    vector> solveNQueens(int n) {
        vector> res; //用于存放结果
        vector board(n, string(n, '.'));//初始化,存放一个结果,n个长度为n的字符串都是由.组成
        backtrack(board, 0, res);//进行递归回溯
        return res;
    }
    
    void backtrack(vector& board, int row, vector>& res){
        if(row==board.size()){
            res.push_back(board);//当够n个字符串的时候压入结果中
            return;
        }
        int n = board[row].size();
        //遍历每一行的每一个元素,判断是否符合,符合的话放在该位置继续走下一行
        for(int col=0; col& board, int row, int col){
        int n = board.size();
        //检查同列,上面第一行到该行有没有皇后存在
        for(int i=0; i=0 && j=0 && j>=0; i--, j--){
            if(board[i][j]=='Q'){
                return false;
            }
        }
        return true;
    }
};

 

你可能感兴趣的:(剪枝,leetcode,c++,N皇后问题,递归回溯)