我正在编写一个数独求解器,使用9x9的数组表示数独格子,使用9x9x9的数组表示数独所有可能性。由于我使用回溯算法,所以必须检查数独是否仍然有效,即:
如果有一个空格没有数字且没有可选项,则返回False。 到目前为止,我已经实现了以下内容:
for j in range(9):
for i in range(9):
if puzzle[j,i] == 0 and (solving[j,i] == 0).sum() == 9:
return False
return True
如果(j, i)方格中包含选项2、3和7,相应的可能性数组将是:
solving[j,i] = array([0, 2, 3, 0, 0, 0, 7, 0, 0], dtype = int8)
我在我的求解器中和其他地方尝试避免这种循环。我尝试了以下方法:
solving[where(puzzle == 0)]
这将返回一个 n x 9 的数组,其中 n 是我拼图中空白方块的数量。如果任何一个形状为 1x9 的 n 个数组恰好等于以下内容,则希望该函数返回 False:
array([0,0,0,0,0,0,0,0,0], dtype = int8)
然而,我尝试了各种方法,包括.any()和.all()实验,但都没有成功。以下是我最近使用的代码:
def is_valid(self, puzzle, solving):
if (solving[py.where(puzzle == 0)].all() == 0).sum() > 0:
return False
return True
...永远返回False。正确的编码方式是什么?