简单数独解谜器python

简单数独解谜器python,python,sudoku,Python,Sudoku,我正在尝试用python编写一个简单的数独解算器。基本概念是,数独谜题部分填充,未解决的单元格用零表示。任何以零表示的单元都可以在拼图的任何阶段求解。因此,如果第一个单元格为0,则表示该行、列和3x3子网格中的值确保该单元格只能有一个可能的值。这是我的代码,我似乎被卡住了,因为输出显示了不止一种可能性。我的算法错了吗 def solveOne (array, posR, posC): possible = ['1','2','3','4','5','6','7','8','9'] for c

我正在尝试用python编写一个简单的数独解算器。基本概念是,数独谜题部分填充,未解决的单元格用零表示。任何以零表示的单元都可以在拼图的任何阶段求解。因此,如果第一个单元格为0,则表示该行、列和3x3子网格中的值确保该单元格只能有一个可能的值。这是我的代码,我似乎被卡住了,因为输出显示了不止一种可能性。我的算法错了吗

def solveOne (array, posR, posC):

possible = ['1','2','3','4','5','6','7','8','9']

for col in range (9):
    if array[posR][col] in possible:
        possible.remove(array[posR][col])


for row in range (9):
    if array[row][posC] in possible:
        possible.remove(array[row][posC])

for row in range(posR, posR+3):
    for col in range (posC, posC+3):
        if array[row::][col::] in possible:
            possible.remove(array[row][col])

print (possible)
return possible

grid = [["" for _ in range(9)] for _ in range(9)] #define a 9x9 2-dimensional list

for row in range(9):
    aLine = input() #prompt user to enter one line of characters
    for col in range(9):
        grid[row][col] = aLine[col:col+1] #assign every character in a line to a position in the 2-D array

for row in range(9):
    for col in range (9):
        if grid[row][col] == '0':
            r = row
            c = col
            newV = solveOne (grid,r,c)
            grid[row][col] = newV

print()
for i in range (9):
    for k in range(9):
        print(grid[i][k], end = "")
    print()

有几个错误:

不会做你想让它做的事。您最好尝试一下(对于python 2.7,请注意div操作不是执行浮点除法,而是执行整数除法):

所以现在它工作得更好了。但是通过这样做

你只玩过一次数独。有时有必要通过一个以上的步骤来解决数独问题——想想看


你还必须意识到并不是每一个数独游戏都有一个独特的解决方案。想想解决一个空的数独游戏吧——在那里你几乎可以“随心所欲”

请修正你的缩进。谢谢你朝着正确的方向轻推。我确实意识到我在3x3次电网方面的错误。但是,如果每个街区只有一个可能的解决方案,我不就只需要穿过suduko一次吗?例如059000483000000012010028000 098074020 04008030 070630540 00016005060000000 735000860此网格中的每一个零只有一个可能的值。这是不够的,因为有时单元格是不明确的单位。如果您填写了其他单元格。
for row in range(posR, posR+3):
    for col in range (posC, posC+3):
        if array[row::][col::] in possible:
            possible.remove(array[row][col])
block = ((posR/3)*3,(posC/3)*3) # get the top left cell of the 3x3 block
for row in range(block[0], block[0]+3):
    for col in range (block[1], block[1]+3):
        if array[row][col] in possible:
            possible.remove(array[row][col])
for row in range(9):
    for col in range (9):
        if grid[row][col] == '0':
            r = row
            c = col
            newV = solveOne (grid,r,c)
            grid[row][col] = newV