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