1. 程式人生 > 其它 >[52. N皇后 II

[52. N皇后 II

52. N皇后 II

n 皇后問題 研究的是如何將 n 個皇后放置在 n × n 的棋盤上,並且使皇后彼此之間不能相互攻擊。

給你一個整數 n ,返回 n 皇后問題 不同的解決方案的數量。

示例 1:

輸入:n = 4
輸出:2
解釋:如上圖所示,4 皇后問題存在兩個不同的解法。

示例 2:

輸入:n = 1
輸出:1

提示:

  • 1 <= n <= 9

思路:

​ 經典N皇后,沒有變化,

class Solution {
public:
    int sum=0;//方案數
    int totalNQueens(int n) {
        //N皇后 從返回解法變成了返回解決方案數量用'.'表示棋盤  'Q'表示棋子
        vector<string>board(n,string(n,'.'));
        backtrack(board,0);
        return  sum;
    }
    void  backtrack(vector<string>&board,int i){
        if(i==board.size()){
            sum++;
            return;
        }
        for(int j=0;j<board.size();j++){
            if(!isValid(board,i,j)){//如果該棋子放進去非法 就不選
                continue;
            }
            //做選擇
            board[i][j]='Q';
            backtrack(board,i+1);
            //撤銷選擇
            board[i][j]='.';
        }
    }
    bool  isValid(vector<string>&board,int row,int col){
        int n=board.size();
        //檢查列 
        for(int i=0;i<row;i++){
            if(board[i][col]=='Q')return false;
        }
        //檢查右上
        for (int i = row - 1, j = col + 1;
             i >= 0 && j < n; 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;
    }
};