本文共 3055 字,大约阅读时间需要 10 分钟。
数独是一种经典的逻辑题目,它的有效性判断主要依赖于每行、每列以及每个3x3的小方块内数字的唯一性。以下是用于判断数独有效性的Python代码:
from typing import Listclass Solution: def isValidSudoku(self, board: List[List[str]]) -> bool: rows = [{} for _ in range(9)] cols = [{} for _ in range(9)] boxes = [{} for _ in range(9)] for i in range(9): for j in range(9): num = board[i][j] if num != '.': num = int(num) box_index = (i // 3) * 3 + (j // 3) rows[i][num] = rows[i].get(num, 0) + 1 cols[j][num] = cols[j].get(num, 0) + 1 boxes[box_index][num] = boxes[box_index].get(num, 0) + 1 if rows[i][num] > 1 or cols[j][num] > 1 or boxes[box_index][num] > 1: return False return True 解数独可以通过回溯算法来实现。该算法通过尝试填充每个空格,并检查是否违反数独规则来逐步填充整个数独表。以下是解数独的Python代码:
from typing import Listclass Solution: def solveSudoku(self, board: List[List[str]]) -> None: def backtrack(pos): if pos == 81: return True row = pos // 9 col = pos % 9 if board[row][col] != '.': return backtrack(pos + 1) for num in range(1, 10): if self.isValid(board, row, col, num): board[row][col] = str(num) if backtrack(pos + 1): return True board[row][col] = '.' return False def isValid(board, row, col, num): for j in range(9): if board[row][j] == str(num): return False for i in range(9): if board[i][col] == str(num): return False box_row = (row // 3) * 3 box_col = (col // 3) * 3 for i in range(box_row, box_row + 3): for j in range(box_col, box_col + 3): if board[i][j] == str(num): return False return True for i in range(9): for j in range(9): if board[i][j] == '.': backtrack(i * 9 + j)
要生成一张标准数独地图,我们需要确保地图有17个数字提示,并且有唯一解。以下是生成标准数独地图的Python函数:
def generate_standard_sudoku(): initial_board = [ ["5","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".","8",".",".","7","9"] ] solver = Solution() solver.solveSudoku(initial_board) print("Standard Sudoku Grid:") for row in initial_board: print(' '.join(row)) 通过以上代码和解释,可以实现数独的有效性判断和解算。有效性判断通过检查每行、每列和每个3x3小方块中的数字唯一性来确定数独的有效性。解算则利用回溯算法,逐步填充空格,确保每一步都符合数独规则。生成标准数独地图则需要结合初始布局和解算算法,确保地图有17个数字提示并且有唯一解。
转载地址:http://dfgfk.baihongyu.com/