2016-04-04 18 views
-1

私はバックトラッキングを使用する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)) 

したがって、gridSize = 0の整数を持つsolveSudokuを呼び出しています。それをグリッドで呼びたくないのですか?

print_grid(grid) 
print(solveSudoku(0)) 

グリッドを送るには解決策になるようだ:

1

あなたはmain機能で、ライン76solveSudoku機能に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

以下のようにisValid関数の最初の3行を変更するには1を比較しようとしているされているので! –

+0

それから、その答えを受け入れることができます。 – aluriak

0

itあなたは、感謝のエラーを修正[1] が

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