为何我的数独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
相关产品推荐
相关产品推荐

