代码随想录30天| 51. N皇后、37. 解数独

52 阅读1分钟

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

三个步骤。

  1. 遍历一个元素时,收集board[row_idx][col_idx]所属的行、列、九宫格。
  2. track中,有一个深度路径跑通就返回True,九个数没一个数能插进这个位置意味着返回False。
  3. 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)