---
# System prepended metadata

title: 'LeetCode #52 [N-Queens II](https://leetcode.com/problems/n-queens-ii/)'
tags: [DFS, Recursion, LeetCode, String, Hard]

---

###### tags: `LeetCode` `Recursion` `Hard` `DFS` `String`
# LeetCode #52 [N-Queens II](https://leetcode.com/problems/n-queens-ii/)
### (Hard)

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

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

![](https://i.imgur.com/HNdKAG1.png)


---

與 [#51](https://hackmd.io/1dNKhOB5Sa-TsMS6p0DnMQ) 幾乎一樣, 差別是只要回傳所有組合的數量而非所有的組合, 因此只要符合終止條件時, 讓計數器+1, 最後再回傳計數器即可。

---
```
class Solution {
public:
    int count=0;
    int totalNQueens(int n) {
        vector<string> board(n, string(n,'.'));
        dfs(board, 0, n);
        return count;
    }
    void dfs(vector<string>& board, int row, const int& n){
        if(row==n)++count;
        for(int col=0;col<n;col++){
            if(!isvalid(board, row, col, n))continue;
            board[row][col]='Q';
            dfs(board, row+1, n);
            board[row][col]='.';
        }
    }
    bool isvalid(vector<string>& board, int row, int col, const int& n){
        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>=0;i--,j--)if(board[i][j]=='Q')return false;//左上
        for(int i=row-1, j=col+1;i>=0&&j<n;i--,j++)if(board[i][j]=='Q')return false;//右上
        return true;
    }
};
```