The n-queens puzzle is the problem of placing n
queens on an n x 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 1:
Input: n = 4 Output: 2 Explanation: There are two distinct solutions to the 4-queens puzzle as shown.
思路:跟N-queen I 一样,不需要build result,只需要count就行了。
class Solution {
public int totalNQueens(int n) {
int[] res = new int[]{0};
char[][] board = new char[n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
board[i][j] = '.';
}
}
dfs(board, res, 0);
return res[0];
}
private void dfs(char[][] board, int[] res, int column) {
if(column == board.length) {
res[0]++;
return;
}
for(int i = 0; i < board.length; i++) {
if(isvalid(board, i, column)) {
board[i][column] = 'Q';
dfs(board, res, column + 1);
board[i][column] = '.';
}
}
}
private boolean isvalid(char[][] board, int x, int y) {
int n = board.length;
// check row;
for(int j = 0; j < n; j++) {
if(j != y && board[x][j] == 'Q') {
return false;
}
}
// check col;
for(int i = 0; i < n; i++) {
if(i != x && board[i][y] == 'Q') {
return false;
}
}
// check diagonal;
for(int k = 0; k < n; k++) {
if((0 <= x - k && 0 <= y - k && board[x - k][y - k] == 'Q')
|| (x + k < n && 0 <= y - k && board[x + k][y - k] == 'Q')
|| (0 <= x - k && y + k < n && board[x - k][y + k] == 'Q')
|| (x + k < n && y + k < n && board[x + k][y + k] == 'Q')) {
return false;
}
}
return true;
}
}