Python解9宫格数独
引言
在计算机编程中,解决数独问题是一个非常经典的算法问题。数独是一种逻辑游戏,需要在9x9的网格中填入数字1-9,使得每一行、每一列和每个3x3的子网格中的数字都不重复。本文将教会你如何使用Python解决数独问题。
流程图
flowchart TD
Start(开始)
Input(输入数独题目)
Solve(解决数独问题)
Output(输出数独解答)
Start --> Input --> Solve --> Output
类图
classDiagram
class SudokuSolver {
-board: List[List[int]]
-size: int
-solve() -> bool
-is_valid(row: int, col: int, num: int) -> bool
-find_unassigned_cell() -> Tuple[int, int]
-is_row_safe(row: int, num: int) -> bool
-is_col_safe(col: int, num: int) -> bool
-is_box_safe(row: int, col: int, num: int) -> bool
}
解决数独的步骤
- 创建一个棋盘表示数独问题,使用二维列表表示。
- 实现一个函数来解决数独问题。该函数使用回溯算法,通过递归的方式尝试填充每个空白格子的数字,直到找到一个有效的解答或者所有格子都填满为止。
- 在每个空白格子中,尝试填入数字1-9,并检查是否满足数独规则。如果满足,则继续递归填充下一个空白格子;如果不满足,则尝试下一个数字。
- 当所有格子都填满时,表示找到了一个有效的解答。如果当前格子无法填入任何数字,则需要回溯到上一个格子,重新尝试填入其他数字。
- 输出解答结果。
代码实现
首先,我们需要创建一个SudokuSolver类来表示数独问题和解决方法。
class SudokuSolver:
def __init__(self, board: List[List[int]]):
self.board = board
self.size = 9
def solve(self) -> bool:
row, col = self.find_unassigned_cell()
# 如果没有未分配的单元格,则表示已找到解答
if row == -1 and col == -1:
return True
# 尝试填充数字1-9
for num in range(1, 10):
if self.is_valid(row, col, num):
self.board[row][col] = num
# 递归解决下一个单元格
if self.solve():
return True
# 如果解决失败,需要回溯并尝试下一个数字
self.board[row][col] = 0
# 如果所有数字都尝试过,没有找到解答,则表示数独问题无解
return False
def is_valid(self, row: int, col: int, num: int) -> bool:
return (
self.is_row_safe(row, num) and
self.is_col_safe(col, num) and
self.is_box_safe(row - row % 3, col - col % 3, num)
)
def find_unassigned_cell(self) -> Tuple[int, int]:
for row in range(self.size):
for col in range(self.size):
if self.board[row][col] == 0:
return row, col
return -1, -1
def is_row_safe(self, row: int, num: int) -> bool:
return num not in self.board[row]
def is_col_safe(self, col: int, num: int) -> bool:
return num not in (row[col] for row in self.board)
def is_box_safe(self, row: int, col: int, num: int) -> bool:
return num not in (
self.board[i][j]
for i in range(row, row + 3)
for j in range(col, col + 3)
)
接下来,我们需要编写代码来读取数独题目并输出解答。
def main():
# 输入数独题目
board = [
[