n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,并且使皇后彼此之間不能相互攻擊。
<small style="box-sizing: border-box; font-size: 12px;">上圖為 8 皇后問題的一種解法。</small>
給定一個整數 n课梳,返回 n 皇后不同的解決方案的數量。
示例:
輸入: 4
輸出: 2
解釋: 4 皇后問題存在如下兩個不同的解法步藕。
[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
class Solution {
static int count = 0;
public int totalNQueens(int n) {
if (n == 1) {
return 1;
}
if (n == 2 || n == 3) {
return 0;
}
int[][] q = new int[n][n];
System.out.println (count);
return total(q, 0, 0);
}
public int total(int[][] q, int x, int y) {
if (x == q.length) {
count++;
// for (int i=0;i<q.length;i++) {
// System.out.println ( Arrays.toString (q[i]));
// }
return 1;
}
int res = 0;
for (int col = 0; col < q.length; col++) {
if (vaild(q, x, col)) {
q[x][col] = 1;
res += total(q, x + 1, col);
q[x][col] = 0;
}
}
return res;
// if (vaild(q, x, y)) {
// q[x][y] = 1;
// for (int col = 0; col < q.length; col++) {
// total(q, x + 1, col);
// }
// q[x][y] = 0;
// }
}
public boolean vaild(int[][] q, int x, int y) {
for (int r = 0; r <= x; r++) {
if (q[r][y] == 1) {
return false;
}
}
for (int i = 1; i <= x ; i++) {
if (x - i >= 0 && y + i < q.length) {
if (q[x - i][y + i] == 1) {
return false;
}
}
}
for (int i = 1; i <= x && i <= y; i++) {
if (q[x - i][y - i] == 1) {
return false;
}
}
return true;
}
}