题目:
Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
思路:
和Leetcode 51思路完全一致。不过因为只需要返回符合条件的解的个数,所以可以在Leetcode 51的基础上做适当优化:我们仅仅用一个一维数组来表示棋盘,即board[i] = j意味着在第i行的皇后放在第j列。如果board[i] == -1,则表示该行上尚未放置皇后。此时对安全性的检查也会变得更加简单,如下代码中的safe函数所示。
代码:
class Solution {
public:
int totalNQueens(int n)
{
int ret = 0;
vector<int> board(n, -1);
DFS(ret, board, n, 0);
return ret;
}
private:
void DFS(int& ret, vector<int>&board, int n, int row)
{
if(row == n)
{
++ret;
return;
}
for(int i = 0; i < n; ++i) // check each col in this row
{
if(safe(board, row, i, n))
{
board[row] = i;
DFS(ret, board, n, row + 1);
board[row] = -1;
}
}
}
bool safe(vector<int>&board, int row, int col, int n)
{
int val1 = row - col;
int val2 = row + col;
int temp = 0;
for(int i = 0; i < row; ++i) // check the previous rows
{
if(board[i] == col)
return false;
temp = i - val1;
if(temp >= 0 && temp < n && board[i] == temp)
return false;
temp = val2 - i;
if(temp >= 0 && temp < n && board[i] == temp)
return false;
}
return true;
}
};