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

为何我的数独naked single检测函数无法识别所有符合条件的单元格?

数独裸单格检测函数问题

我正在做第二个新手项目——编写数独谜题求解程序。代码里包含三个9×9数独棋盘:当前启用的棋盘能检测出7个裸单格(naked single),但另外两个实际存在裸单格的棋盘检测结果却是0,我怀疑逻辑里漏了关键步骤。

先明确裸单格的定义:

在应用解题技巧排除其他候选数后剩余的唯一候选数,即单元格中仅剩的候选数,也称为Forced Digit或Sole Candidate

以下是我的代码:

# 第二个棋盘:存在隐式单格但未被检测到
# board = [
#     [0, 0, 5, 3, 0, 0, 0, 0, 0],
#     [8, 0, 0, 0, 0, 0, 0, 2, 0],
#     [0, 7, 0, 0, 1, 0, 5, 0, 0],
#     [4, 0, 0, 0, 0, 5, 3, 0, 0],
#     [0, 1, 0, 0, 7, 0, 0, 0, 6],
#     [0, 0, 3, 2, 0, 0, 0, 8, 0],
#     [0, 6, 0, 5, 0, 0, 0, 0, 9],
#     [0, 0, 4, 0, 0, 0, 0, 3, 0],
#     [0, 0, 0, 0, 0, 9, 7, 0, 0]
# ]

# 第三个棋盘:存在隐式单格但未被检测到
# board = [
#      [0, 0, 0, 7, 0, 6, 0, 0, 0],
#      [0, 0, 9, 0, 3, 0, 0, 0, 2],
#      [0, 6, 0, 9, 0, 0, 0, 0, 1],
#      [0, 0, 5, 0, 1, 0, 4, 0, 0],
#      [0, 0, 6, 0, 0, 0, 7, 0, 0],
#      [0, 3, 0, 0, 7, 4, 8, 0, 0],
#      [8, 0, 0, 0, 9, 0, 1, 0, 0],
#      [0, 0, 0, 0, 0, 0, 0, 0, 0],
#      [0, 0, 3, 0, 4, 0, 0, 0, 5]
# ]

def count_naked_singles(board):
    count = 0
    for i in range(9):
        for j in range(9):
            if board[i][j] == 0:
                possibilities = set(range(1, 10))
                # 检查行
                for k in range(9):
                    possibilities.discard(board[i][k])
                # 检查列
                for k in range(9):
                    possibilities.discard(board[k][j])
                # 检查3×3宫格
                box_row = (i // 3) * 3
                box_col = (j // 3) * 3
                for m in range(box_row, box_row + 3):
                    for n in range(box_col, box_col + 3):
                        possibilities.discard(board[m][n])
                if len(possibilities) == 1:
                    count += 1
    return count


# 测试棋盘:包含7个裸单格
board = [
    [0, 0, 0, 7, 0, 2, 9, 0, 0],
    [0, 9, 0, 0, 8, 1, 2, 0, 0],
    [8, 7, 2, 4, 5, 0, 0, 1, 3],
    [1, 0, 0, 0, 7, 0, 4, 2, 0],
    [9, 0, 0, 1, 0, 5, 0, 0, 8],
    [0, 4, 0, 0, 0, 0, 5, 6, 0],
    [0, 3, 5, 8, 0, 4, 0, 9, 6],
    [0, 8, 0, 0, 3, 6, 7, 0, 0],
    [0, 0, 0, 5, 0, 0, 0, 3, 2]
]
count = count_naked_singles(board)
print(f"检测到的裸单格数量为 {count}")

我尝试过不同的数独棋盘,有时函数能检测出隐式单格(hidden single),有时却会遗漏。当前启用的棋盘可以通过修改后的count_naked_singles函数仅依靠查找裸单格完成求解。

我的问题是:为什么count_naked_singles(board)函数无法识别所有存在裸单格的数独棋盘中的这类单元格?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:24:58