题解 | #N皇后问题#
N皇后问题
https://www.nowcoder.com/practice/c76408782512486d91eea181107293b6
import java.util.*;
public class Solution {
int count = 0;
boolean[] columns; // 记录同一列是否已放置皇后
boolean[] line1; // 记录从左上到右下的对角线是否已放置皇后
boolean[] line2; // 记录从左下到右上的对角线是否已放置皇后
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型 the n
* @return int整型
*/
public int Nqueen (int n) {
columns = new boolean[n];
line1 = new boolean[2 * n];
line2 = new boolean[2 * n];
// 从第一行开始放置皇后
dfs(n, 0);
return count;
}
private void dfs(int n, int r) {
// 所有行都放了一个皇后,为其中一个答案,count++
if (r == n) {
count++;
return;
}
for (int j = 0; j < n; j++) {
// 判断当前行:r, 当前列:c以及对角线是否都不存在皇后
if (!columns[j] && !line1[r + j] && !line2[r - j + n]) {
// 当前行放置好
columns[j] = line1[r + j] = line2[r - j + n] = true;
// 到下一行找合适的列放置
dfs(n, r + 1);
// 回溯
columns[j] = line1[r + j] = line2[r - j + n] = false;
}
}
}
}