如何修复此代码:
def CheckRow(arr, row, num):
for col in range(9):
if (arr[row][col] == num):
return True
return False
TypeError: list indices must be integers, not type
row
或col
不是整数,其中一个是type
。检查它们,可能其中一个等于None
,因为您说它是类中的函数。
def SolveSudoku(arr):
row = int
col = int
if (not FinZero(arr, row, col)):
return True
for num in range(1,10):
if (IsSafe(arr, row, col, num)):
arr[row][col] = num
if (SolveSudoku(arr)):
return True
arr[row][col] = 0
return False
在本部分中,您可以看到row = int
。这是我见过的最糟糕的定义,可能是代码作者试图定义一个空整数。基本上将其更改为row = int()
。
检查此
row = int
row_int = int()
print (type(row))
print (type(row_int))
输出;
>>>
<class 'type'>
<class 'int'>
>>>
第一个是type
,第二个是integer
。
错误不在于代码,而在于输入。
很可能您传递的参数row
不是整数。
你的代码也应该这样格式化:
def CheckRow(arr, row, num):
for col in range(9):
if (arr[row][col] == num):
return True
return False
编辑
我查看了你在GLHF的帖子中链接的代码。
转换问题
这是我的版本,在C++代码中保留所有的命名约定。
UNASSIGNED = 0
N = 9
def FindUnassignedLocation(grid, row, col):
for row in range(N):
for col in range(N):
if grid[row][col] == UNASSIGNED:
return True
return False
def UsedInRow(grid, row, num):
for col in range(N):
if grid[row][col] == num:
return True
return False
def UsedInCol(grid, col, num):
for row in range(N):
if grid[row][col] == num:
return True
return False
def UsedInBox(grid, boxStartRow, boxStartCol, num):
for row in range(3):
for col in range(3):
if grid[row + boxStartRow][col + boxStartCol] == num:
return True
return False
def isSafe(grid, row, col, num):
return False not in (UsedInRow(grid, row, num),
UsedInCol(grid, col, num),
UsedInBox(grid, row - (row % 3), col - (col % 3), num)):
def printGrid(grid):
for row in range(N):
for col in range(N):
print "%2d" % (grid[row][col])
def SolveSodoku(grid):
row = 0
col = 0
if not FinZero(grid, row, col):
return True
for num in range(1,10):
if isSafe(grid, row, col, num):
grid[row][col] = num
if SolveSodoku(grid):
return True
else:
grid[row][col] = UNASSIGNED
return False
grid = [
[ 3, 0, 0, 0, 0, 0, 5, 0, 0 ],
[ 0, 0, 0, 8, 0, 6, 0, 0, 0 ],
[ 0, 2, 5, 0, 0, 0, 6, 0, 1 ],
[ 7, 0, 9, 0, 3, 8, 0, 0, 4 ],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 1, 0, 0, 9, 4, 0, 3, 0, 6 ],
[ 8, 0, 3, 0, 0, 0, 7, 6, 0 ],
[ 0, 0, 0, 3, 0, 4, 0, 0, 0 ],
[ 0, 0, 1, 0, 0, 0, 0, 0, 9 ]
]
if SolveSodoku(grid):
printGrid(grid)
else:
print "No solution exists"
您遇到的问题是,当从C++转换为Python时,C++中的语句
int row, col;
将实际实例化默认值为0的变量。因此,它相当于Python的
row = 0
col = 0
最大递归深度
这个问题应该会在这个帖子中得到解决。
是的,这是一种防止堆栈溢出的措施。
您可以使用
sys.setrecursionlimit
更改递归限制,但这样做是危险的——标准限制有点保守,但Python堆栈框架可能相当大。
然而,当你增加最大递归深度时,它确实警告说它可能会使Python崩溃(就像它在我的计算机上所做的那样),我建议你在这里看看解决递归数独的解决方案之一。