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;
}
}