[Python] 纯文本查看 复制代码 def solve_six_diagonal_sudoku():
# 初始化 6x6 空网格 (0 代表空)
grid = [[0 for _ in range(6)] for _ in range(6)]
solutions = []
# 检查在 (row, col) 填入 num 是否合法
def is_valid(row, col, num):
# 1. 检查行
if num in grid[row]:
return False
# 2. 检查列
for r in range(6):
if grid[r][col] == num:
return False
# 3. 检查 2x3 宫
# 计算宫的起始位置: 行每2行一分,列每3列一分
start_row = (row // 2) * 2
start_col = (col // 3) * 3
for r in range(start_row, start_row + 2):
for c in range(start_col, start_col + 3):
if grid[r][c] == num:
return False
# 4. 检查主对角线 (左上到右下: row == col)
if row == col:
for i in range(6):
if grid[i][i] == num:
return False
# 5. 检查副对角线 (右上到左下: row + col == 5)
if row + col == 5:
for i in range(6):
if grid[i][5 - i] == num:
return False
return True
# 回溯算法主体
def backtrack():
# 寻找下一个空位置
for row in range(6):
for col in range(6):
if grid[row][col] == 0:
# 尝试填入 1 到 6
for num in range(1, 7):
if is_valid(row, col, num):
grid[row][col] = num
backtrack() # 递归
grid[row][col] = 0 # 回溯
return
# 如果没有空位置了,说明找到一个解
solutions.append([row[:] for row in grid])
# 开始求解
backtrack()
return solutions
# --- 辅助函数:将数字解转换为 a-f 格式并打印 ---
def print_solutions(solutions):
mapping = ['a', 'b', 'c', 'd', 'e', 'f'] # 1->a, 2->b...
print(f"总共找到 {len(solutions)} 个解!\n")
for idx, sol in enumerate(solutions):
print(f"解 {idx + 1}:")
for row in sol:
# 将数字转换为字母并打印
line = ' '.join([mapping[n-1] for n in row])
print(line)
print("-" * 15)
# --- 运行程序 ---
all_solutions = solve_six_diagonal_sudoku()
print_solutions(all_solutions) |