【问题标题】:Python sudoku solver blocksPython数独求解器块
【发布时间】:2014-03-13 17:55:03
【问题描述】:

我的数独求解器有问题。 我能够检查垂直和水平,但现在我将检查块。 这是我现在用于检查块的代码

def print_sudoku(array):
    for i in range(0,3):
        print()
        for j in range(0,3):
            print(array[i][j][0],end=' ')
def controleren(array):
    for i in range(0,8):
        for j in range(0,8):
            if distance[i][j][1] + distance[i][j][2]+ distance[i][j][3]+ distance[i][j][4]+ distance[i][j][5]+ distance[i][j][6]+ distance[i][j][7]+ distance[i][j][8]+ distance[i][j][9] == 1:
                if distance[i][j][k] == 1:
                    distance[i][j][k] = k

def main():
    pass
import pprint
distance = [[[0 for k in range(10)] for j in range(3)] for i in range(3)]

distance[0][0][0] = '*'
distance[0][1][0] = 2
distance[0][2][0] = 3
distance[1][0][0] = 4
distance[1][1][0] = 5
distance[1][2][0] = 6
distance[2][0][0] = 7
distance[2][1][0] = 8
distance[2][2][0] = 9

print_sudoku(distance)

这里我给每一种可能性值 1

for i in range(0,3):
    for j in range(0,3):
        if distance[i][j][0] == '*':
            for k in range(1,10):
                distance[i][j][k] = 1

这是重要的部分。 while 循环是无限距离[0][0][0] 保持等于 * 而不是获得 1 的值,这是块中唯一缺少的数字。正在发生的事情是:已经站在另一个距离[][][] 之一中的每个值都设置为 0

while distance[0][0][0] == '*':
    for i in range(0,3):
        for j in range(0,3):
            if distance[i][j][0] != '*':
                k = distance[i][j][0]
                for i in range(0,3):
                    for j in range(0,3):
                        distance[i][j][k] = 0

在这一部分中,代码会查找缺失的数字,因此是否存在一种可能性,即一个值为 1 的数字,因为该数字就是缺失的数字。

    for i in range(0,3):
        for j in range(0,3):
            if distance[i][j][1] + distance[i][j][2]+ distance[i][j][3]+ distance[i][j][4]+ distance[i][j][5]+ distance[i][j][6]+ distance[i][j][7]+ distance[i][j][8]+ distance[i][j][9] == 1:
                for k in range(1,10):
                    if distance[i][j][k] == 1:
                        distance[i][j][0] = k

print('')
print_sudoku(distance)

我希望你理解它,可能不理解(我很难解释我在做什么)所以如果有什么不清楚的地方就说出来。

鲁迪

【问题讨论】:

  • 我知道这不是你的主要问题,但你不需要 0 作为范围内的第一个参数。 range(3) 就足够了。
  • 是的,你是对的,但我认为这只是一种习惯 :)
  • 自我推广:我在 Excel VBA 中编写了一个数独求解器。代码在github.com/wkschwartz/xlSudoku
  • 你知道在你的无限while循环中有两个is和js吗?如果不是故意的,请尝试将它们重命名为其他名称,例如 n-m。
  • 在您的 while 循环中,您嵌套了使用相同迭代变量的 for 循环。这会导致问题。

标签: python block sudoku solver


【解决方案1】:
while distance[0][0][0] == '*':
    for i in range(0,3):
        for j in range(0,3):
            if distance[i][j][0] != '*':
                k = distance[i][j][0]
                for i in range(0,3):
                    for j in range(0,3):
                        distance[i][j][k] = 0

这里有两个is 和js。我认为这是导致问题的部分。尝试重命名它们,因为它会影响输出。

所以底部应该是这样的。

 k = distance[i][j][0]
 for m in range(0,3):
     for n in range(0,3):
         distance[m][n][k] = 0

这是您的代码。

distance = [[[0 for k in range(10)] for j in range(3)] for i in range(3)]

distance[0][0][0] = '*'
distance[0][1][0] = 2
distance[0][2][0] = 3
distance[1][0][0] = 4
distance[1][1][0] = 5
distance[1][2][0] = 6
distance[2][0][0] = 7
distance[2][1][0] = 8
distance[2][2][0] = 9

for i in range(0,3):
    for j in range(0,3):
        if distance[i][j][0] == '*':
            for k in range(1,10):
                distance[i][j][k] = 1

if distance[0][0][0] == '*':
    for i in range(0,3):
        for j in range(0,3):
            if distance[i][j][0] != '*':
                k = distance[i][j][0]
                for i in range(0,3):
                    for j in range(0,3):
                        distance[i][j][k] = 0
print (distance)

当有相同的迭代变量时:

>>>[[['*', 1, 0, 1, 0, 1, 1, 0, 0, 0], ... ]

重命名后:

>>>[[['*', 1, 0, 0, 0, 0, 0, 0, 0, 0], ...]

我将while 更改为if 以查看distance 的变化。

【讨论】:

  • 所以我唯一要做的就是将后两个 for 循环更改为其他数字,例如 n 和 m,将 distance[i][j][k] 更改为 distance[n][m][ k]?
  • 是的。我忘了添加它们。编辑答案。
  • 你说得对,它工作正常!!谢谢!但对于其他块,我可以改变范围?
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多