python
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
col = [0] * n
right_left = [0] * 2 * n
left_right = [0] * 2 * n
res = []
path = []
def backtrack(row : int) -> None:
if len(path) == n:
res.append(path[:])
return
for i in range(0, n):
# 每一行从0 -> n 遍历
if col[i] or right_left[row + i] or left_right[n - row + i - 1]:
# 如果冲突则跳过当前位置
continue
# 构建当前行的放置
path_str = ""
for j in range(0, n):
if j == i:
path_str += 'Q'
else:
path_str += '.'
path.append(path_str)
col[i] = 1
right_left[row + i] = 1
left_right[n - row + i - 1] = 1
backtrack(row + 1)
path.pop()
col[i] = 0
right_left[row + i] = 0
left_right[n - row + i - 1] = 0
backtrack(0)
return res
python
class Solution:
def solveSudoku(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
# 记录行、列、3 * 3 box是否出现过某个数字, row[r][num]代表第r行是否存在数字num
row = [[False] * 10 for _ in range(9)]
col = [[False] * 10 for _ in range(9)]
box = [[[False] * 10 for _ in range(3)] for _ in range(3)]
# 存储所有空白位置
spaces = []
# 初始化空间
for r in range(9):
for c in range(9):
if board[r][c] == '.':
spaces.append((r, c))
else:
num = int(board[r][c])
row[r][num] = True
col[c][num] = True
box[r // 3][c // 3][num] = True
def backtrack(index : int) -> bool:
if index == len(spaces):
# 如果填完了所有空白就结束返回
return True
r, c = spaces[index]
for num in range(1, 10):
# 对每个空白格,尝试填入 1-9
if row[r][num] or col[c][num] or box[r // 3][c // 3][num]:
continue
# 做出选择
board[r][c] = str(num)
row[r][num] = True
col[c][num] = True
box[r // 3][c // 3][num] = True
if backtrack(index + 1):
return True
# 撤销选择
board[r][c] = "."
row[r][num] = False
col[c][num] = False
box[r // 3][c // 3][num] = False
return False
backtrack(0)