簡體   English   中英

回溯suduko求解器python

[英]backtracking suduko solver python

我正在用Python編寫使用回溯的Suduko Solver編碼,我認為邏輯是正確的,但是我遇到的問題是回溯(我假設與類型轉換有關),並且不斷獲得相同的回溯,但是我沒有不知道是什么原因造成的:

Traceback (most recent call last):

  File "a.py", line 78, in <module>
    main()

File "a.py", line 75, in main
    print(solveSudoku(0))

  File "a.py", line 27, in solveSudoku
    i,j = findNextCellToFill(grid, i, j)

  File "a.py", line 4, in findNextCellToFill
    if grid[x][y] == 0:
TypeError: 'int' object is not subscriptable

這是我的代碼:

def findNextCellToFill(grid, i, j):
    for x in range(i,9):
            for y in range(j,9):
                    if grid[x][y] == 0:
                            return x,y
    for x in range(0,9):
            for y in range(0,9):
                    if int(grid[x][y]) == 0:
                        return x,y
    return -1,-1

def isValid(grid, i, j, e):
    rowOk = all([e != grid[i][x] for x in range(9)])
    if rowOk:
            columnOk = all([e != grid[x][j] for x in range(9)])
            if columnOk:
                        # finding the top left x,y co-ordinates of the section containing the i,j cell
                    secTopX, secTopY = 3 *(i/3), 3 *(j/3)
                    for x in range(secTopX, secTopX+3):
                            for y in range(secTopY, secTopY+3):
                                    if grid[x][y] == e:
                                            return False
                    return True
    return False

def solveSudoku(grid, i=0, j=0):
    i,j = findNextCellToFill(grid, i, j)
    if i == -1:
            return True
    for e in range(1,10):
            if isValid(grid,i,j,e):
                    grid[i][j] = e
                    if solveSudoku(grid, i, j):
                            return True
                        # Undo the current cell for backtracking
                    grid[i][j] = 0
    return False

def print_grid(grid):
"""
A sloppy function to print the 9 x 9 sudoku grid 
so it's a bit easier to visualize
"""
    n = len(grid)
    for row_ind, row in enumerate(grid):
    if row_ind % 3 == 0:
        print("-----------------------------")
    for col_ind, val in enumerate(row):
        if col_ind == 8:
            print(" ", val, "|")
        elif col_ind % 3 == 0:
            print("|", val, end="")
        else:
            print(" ", val, end="")
    print("-----------------------------")

def main():
"""
A test instance for the Sudoku Solver
"""
# here is an easy sample grid.  0 is used for a blank.
# each row, column, and three by three subgrid should contain
# one of each number from 1 to 9
    grid = [[0, 0, 8, 9, 3, 0, 0, 1, 0],
        [0, 0, 5, 0, 0, 6, 3, 7, 0],
        [3, 7, 0, 0, 2, 5, 0, 8, 0],
        [0, 0, 0, 0, 0, 0, 0, 6, 0],
        [9, 2, 1, 4, 0, 3, 8, 5, 7],
        [0, 3, 0, 0, 0, 0, 0, 0, 0],
        [0, 6, 0, 5, 9, 0, 0, 4, 8],
        [0, 9, 2, 6, 0, 0, 5, 0, 0],
        [0, 5, 0, 0, 1, 4, 9, 0, 0]
]
    print_grid(grid)
    print(solveSudoku(0))

if __name__ == '__main__':
    main()

仔細查看您的回溯。 在代碼底部附近,您有以下內容:

print_grid(grid)
print(solveSudoku(0))

因此,您正在調用grid = 0(這是一個整數)的solveSudoku。 您不想用網格調用它嗎?

您發送0solveSudoku在行功能76 ,在main功能:

print_grid(grid)
print(solveSudoku(0))

發送網格似乎是一種解決方案:

print(solveSudoku(grid))

現在,錯誤是:

Traceback (most recent call last):
  File "p.py", line 79, in <module>
    main()
  File "p.py", line 76, in main
    print(solveSudoku(grid))
  File "p.py", line 31, in solveSudoku
    if isValid(grid,i,j,e):
  File "p.py", line 19, in isValid
    for x in range(secTopX, secTopX+3):
TypeError: 'float' object cannot be interpreted as an integer

這是因為您試圖將1與[1]進行比較,如下所示修改isValid函數的前3行

def isValid(grid, i, j, d):
    e = []
    e.append(d)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM