You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决数独求解程序中网格出现重复值的问题?

数独求解程序错误修复

你的代码核心问题出在valid函数的执行逻辑和列校验的索引错误上,具体问题及修复如下:

主要问题分析

  1. 代码执行截断:valid函数中,行校验完成后直接return True,导致后续的列校验、3×3区块校验代码完全没有执行,这是网格出现重复值的根本原因。
  2. 列校验索引错误:列校验循环中,你错误使用了grid[y][i],正确的应该是grid[i][y](y是列索引,需要遍历每一行的该列位置)。
  3. 3×3区块校验的参数污染:直接修改函数参数x和y会导致后续逻辑出错,应该使用临时变量存储区块起始坐标。

修复后的完整代码

grid2 = [[5,3,0,0,7,0,0,0,0], 
         [6,0,0,1,9,5,0,0,0], 
         [0,9,8,0,0,0,0,6,0], 
         [8,0,0,0,6,0,0,0,3], 
         [4,0,0,8,0,3,0,0,1], 
         [7,0,0,0,2,0,0,0,6], 
         [0,6,0,0,0,0,2,8,0], 
         [0,0,0,4,1,9,0,0,5], 
         [0,0,0,0,8,0,0,7,9]]

def valid(grid, x, y, n):
    # 校验当前行
    for i in range(9):
        if grid[x][i] == n:
            return False
    # 校验当前列(修复索引错误)
    for i in range(9):
        if grid[i][y] == n:
            return False
    # 校验3×3区块(使用临时变量避免修改参数)
    block_x = (x // 3) * 3
    block_y = (y // 3) * 3
    for i in range(3):
        for j in range(3):
            if grid[block_x + i][block_y + j] == n:
                return False
    return True

def sudoku(grid):
    for x in range(9):
        for y in range(9):
            if grid[x][y] == 0:
                for n in range(1, 10):
                    if valid(grid, x, y, n):
                        grid[x][y] = n
                        result = sudoku(grid)
                        if result is not None:
                            return result
                        grid[x][y] = 0
                return
    return grid

# 测试求解
solution = sudoku(grid2)
for row in solution:
    print(row)

修复说明

  • 移除了行校验后的return True,让函数依次执行行、列、区块校验,只有所有校验都通过才返回True。
  • 修正列校验的索引为grid[i][y],确保检查的是当前列的所有行。
  • 使用block_x和block_y存储3×3区块的起始坐标,避免修改原函数参数x和y导致的逻辑混乱。

内容的提问来源于stack exchange,提问作者Armenta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:22:41