- 题目:
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。
-
示例 1:
输入:n = 4 输出:2 解释:如上图所示,4 皇后问题存在两个不同的解法。
-
示例 2:
输入:n = 1 输出:1
-
提示
1 <= n <= 9
- 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
思路 :
- 与LeetCode 51题思路一样,但是只需要记录总共有多少种解法就行
样例代码
public int totalNQueens(int n) {
char[][] arr = new char[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = '.';
}
}
// 为了将计数的参数作为实参,故意设为一个数组。菜鸡为了偷懒的做法
int[] count=new int[]{0};
dfs(count, arr, 0, 0);
return count[0];
}
private void dfs(int[] count, char[][] arr, int x, int y) {
if (x >= arr.length || y >= arr.length) {
count[0]++;
return;
}
for (int i = x; i < arr.length; i++) {
if (isCanPut(arr, i, y)) {
arr[i][y] = 'Q';
dfs(count, arr, 0, y + 1);
arr[i][y] = '.';
}
}
}
private boolean isCanPut(char[][] arr, int x, int y) {
int y2;
// 判断在这个位置是否可以放皇后
for (int j = 1; j < arr.length; j++) {
y2 = y - j;
if (y2 < 0) {
// 可以放
return true;
}
if (x - j >= 0 && arr[x - j][y2] == 'Q') {
return false;
}
if (x + j < arr.length && arr[x + j][y2] == 'Q') {
return false;
}
if (arr[x][y2] == 'Q') {
return false;
}
}
return true;
}