###### 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; } }; ```