Poison

52. N-Queens II

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class Solution {
private static class CountHolder {
private int count;
}

public int totalNQueens(int n) {
CountHolder countHolder = new CountHolder();

char[][] board = new char[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
board[i][j] = '.';
}
}

dfs(countHolder, board, 0);
return countHolder.count;
}

private void dfs(CountHolder countHolder, char[][] board, int rowIndex) {
if (rowIndex == board.length) {
countHolder.count++;
return;
}

for (int j = 0; j < board.length; j++) {
if (canFill(board, rowIndex, j)) {
board[rowIndex][j] = 'Q';
dfs(countHolder, board, rowIndex + 1);
board[rowIndex][j] = '.';
}
}
}

private List<String> toList(char[][] board) {
List<String> lineList = new ArrayList<>(board.length);
for (char[] line : board) {
lineList.add(new String(line));
}
return lineList;
}

private boolean canFill(char[][] used, int i, int j) {
for (int k = 0; k <= i; k++) {
if (used[k][j] == 'Q') {
return false;
}
}

for (int x = i - 1, y = j - 1; x >= 0 && y >= 0; x--, y--) {
if (used[x][y] == 'Q') {
return false;
}
}
for (int x = i - 1, y = j + 1; x >= 0 && y < used.length; x--, y++) {
if (used[x][y] == 'Q') {
return false;
}
}

return true;
}
}
Reference

52. N-Queens II