LeetCode Q 52 - N-Queens II
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return the number of distinct solutions to the n-queens puzzle.
Example:Input: 4 ; Output: 2
Explanation: There are two distinct solutions to the 4-queens puzzle as shown below.
[
[“.Q..”, // Solution 1
“…Q”,
“Q…”,
“..Q.”],
[“..Q.”, // Solution 2
“Q…”,
“…Q”,
“.Q..”]
]
Solution : DFS
Code:
private int res;
public int totalNQueens(int n) {
if (n <= 1) return n;
char[][] board = new char[n][n];
for (char[] row: board) {
for (int j = 0; j < n; j++) row[j] = '.';
}
solve(board, n, 0);
return res;
}
private void solve(char[][] board, int N, int row) {
if (row == N) {
res++; return;
}
for (int col = 0; col < N; col++) {
if (board[row][col] == '.' && isValid(board, N, row, col)) {
board[row][col] = 'Q';
solve(board, N, row + 1);
board[row][col] = '.';
}
}
return;
}
private boolean isValid(char[][] board, int N, int row, int col) {
// check row
for (int j = 0; j < N; j++) {
if (board[row][j] == 'Q') return false;
}
// check col
for (int i = 0; i < N; i++) {
if (board[i][col] == 'Q') return false;
}
// check diagonal
int r = row, c = col;
while (r >= 0 && c >= 0) {
if (board[r--][c--] == 'Q') return false;
}
r = row; c = col;
while (r < N && c < N) {
if (board[r++][c++] == 'Q') return false;
}
// check another diagonal
r = row; c = col;
while (r < N && c >= 0) {
if (board[r++][c--] == 'Q') return false;
}
r = row; c = col;
while (r >= 0 && c < N) {
if (board[r--][c++] == 'Q') return false;
}
return false;
}