按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
class Solution: def solveSudoku(self, board: List[List[str]]) -> None: """ Do not return anything, modify board in-place instead. """ def isvad(row, col, k): for i in range(9): if board[row][i] == k: return False if board[i][col] == k: return False for i in range(3): for j in range(3): if board[(row // 3) * 3 + i][(col // 3) * 3 + j] == k: return False return True def backtrack(): for i in range(9): for j in range(9): if board[i][j] == '.': for k in '123456789': if isvad(i, j, k): board[i][j] = k if backtrack(): return True board[i][j] = '.' return False return True backtrack()
class Solution: def solveSudoku(self, board: List[List[str]]) -> None: """ Do not return anything, modify board in-place instead. """ rows = [set() for _ in range(9)] cols = [set() for _ in range(9)] # 注意初始化写法 boxes = [[set() for _ in range(3)] for _ in range(3)] empty = []
for i in range(9): for j in range(9): if board[i][j] == '.': empty.append((i, j)) else: rows[i].add(board[i][j]) cols[j].add(board[i][j]) boxes[i // 3][j // 3].add(board[i][j])
def backtrack(pos): if pos == len(empty): return True
i, j = empty[pos] for ch in '123456789': if (ch not in rows[i] and ch not in cols[j] and ch not in boxes[i // 3][j // 3]):