2016-04-04 49 views
-1

我编写了一个Suduko求解器在Python中使用后退跟踪,我觉得这个逻辑是正确的,但我遇到的问题是追溯(我假设与类型转换有关)并继续获取同样的回溯,但我不知道是什么原因造成的:回溯suduko求解器python

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() 

回答

2

看。在你的代码的底部附近你有这个:

print_grid(grid) 
print(solveSudoku(0)) 

所以,你打电话solveSudoku与grid = 0这是一个整数。你不想用电网来称呼它吗?

1

您在行76发送0solveSudoku功能,在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 
+0

固定的错误,谢谢! –

+0

然后,你可以接受答案。 – aluriak

0

它是因为你试图比较1 [1] 修改第3行的isValid功能如下

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