51. N 皇后
1. first idea
class Solution:
def __init__(self):
self.res_list = []
def back_track(self, disk, pre_idx_list, left_queue_num, n):
if left_queue_num == 0:
self.res_list.append(disk)
return
forbid_list = []
for idx in range(len(pre_idx_list)):
# idx 表示当前层id
cur_level = n - left_queue_num
offset = cur_level - idx
forbid_list.append(pre_idx_list[idx])
if pre_idx_list[idx] - offset >= 0:
forbid_list.append(pre_idx_list[idx] - offset)
if pre_idx_list[idx] + offset < n:
forbid_list.append(pre_idx_list[idx] + offset)
tmp_row = ["."] * n
for idx in range(n):
if idx not in forbid_list:
new_tmp_row = copy.deepcopy(tmp_row)
new_tmp_row[idx] = "Q"
self.back_track(disk + ["".join(new_tmp_row)], pre_idx_list + [idx], left_queue_num - 1, n)
def solveNQueens(self, n: int) -> List[List[str]]:
self.back_track([], [], n, n)
return self.res_list
37. 解数独
1. first idea
三个步骤。
- 遍历一个元素时,收集
board[row_idx][col_idx]所属的行、列、九宫格。 - track中,有一个深度路径跑通就返回True,九个数没一个数能插进这个位置意味着返回False。
- track中,如果board全填满,1~9尝试循环压根儿没进去,那说明深度到最底层了,返回True。
class Solution:
def count_3record_list(self, board, row_idx, col_idx):
cols_list = []
for idx in range(len(board)):
if board[idx][col_idx] != ".":
# column record list
cols_list.append(int(board[idx][col_idx]))
rows_list = []
for idx in range(len(board[0])):
if board[row_idx][idx] != ".":
rows_list.append(int(board[row_idx][idx]))
tmp_list = []
row_idx = row_idx // 3
col_idx = col_idx // 3
for row_offset in range(3):
for col_offset in range(3):
if board[3 * row_idx + row_offset][3 * col_idx + col_offset] != ".":
tmp_list.append(int(board[3 * row_idx + row_offset][3 * col_idx + col_offset]))
return rows_list, cols_list, tmp_list
def track(self, board):
for row_idx in range(len(board)):
for col_idx in range(len(board[0])):
if board[row_idx][col_idx] == ".":
grid_idx = (row_idx // 3) * 3 + (col_idx // 3)
for num in range(1, 10):
rows_list, cols_list, big_grid_list = self.count_3record_list(board, row_idx, col_idx)
if (num not in cols_list) and (num not in rows_list) and (num not in big_grid_list):
board[row_idx][col_idx] = str(num)
if self.track(board):
return True
board[row_idx][col_idx] = "."
return False
return True
def solveSudoku(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
self.track(board)