privatefunbacktrack(r: Int) { val n = grid.size // 所有的行选择完了,n个皇后也摆放完了,可以添加结果了 if (r == n) { val solution = grid.map { row -> row.joinToString("") } result.add(solution) return }
// 在当前后的每一列都可以做出选择 for (c in0 until n) { if (!isValid(r, c)) continue grid[r][c] = 'Q' backtrack(r + 1) grid[r][c] = '.' } }
privatefunisValid(r: Int, c: Int): Boolean { val n = grid.size // 检查第c列有没有皇后,有皇后了就不能选这列 for (i in0 until n) { if (grid[i][c] == 'Q') { returnfalse } }
// 斜着的也能走,要考虑斜着的四个方向,但其实我们选择的时候是从上往下选择的,所以只要考虑左上和右上的方向有没有皇后 // 检查左上方有没有皇后 var i = r - 1 var j = c - 1 while (i >= 0 && j >= 0) { if (grid[i][j] == 'Q') returnfalse i-- j-- } // 检查右上方有没有皇后 i = r - 1 j = c + 1 while (i >= 0 && j < n) { if (grid[i][j] == 'Q') returnfalse i-- j++ } returntrue }