解法一:
class Solution {
private int ways;
public int totalNQueens(int n) {
int[] result = new int [n];
ways = 0;
place(0, n, result);
return ways;
}
private void place(int row, int n, int[] result){
if (row == n){
ways++;
return;
}
for (int column = 0; column < n; column++){
if (isValid(row, column, result)){
result[row] = column;
place(row + 1, n, result);
}
}
}
private boolean isValid(int row, int col, int[] result){
for (int i = 0; i < row; i++){
if (result[i] == col) return false;
if (row - i == Math.abs(col - result[i])) return false;
}
return true;
}
}
解法二:
class Solution {
boolean[] cols;
boolean[] leftTop;
boolean[] rightTop;
private int ways;
public int totalNQueens(int n) {
cols = new boolean[n];
leftTop = new boolean[(n << 1) - 1];
rightTop = new boolean[(n << 1) - 1];
ways = 0;
place(0);
return ways;
}
private void place(int row) {
if (row == cols.length) {
ways++;
return;
}
for (int col = 0; col < cols.length; col++) {
if (cols[col]) continue;
int ltIndex = row - col + cols.length - 1;
if (leftTop[ltIndex]) continue;
int rtIndex = row + col;
if (rightTop[rtIndex]) continue;
cols[col] = leftTop[ltIndex] = rightTop[rtIndex] = true;
place(row + 1);
cols[col] = leftTop[ltIndex] = rightTop[rtIndex] = false;
}
}
}