这是我在python中的代码,对knightsTour(0,0,1,sol,xMove,yMove)
的调用应该返回True
,但我得到False
。我无法追捕这个错误。
def safe(x,y,sol):
return x >= 0 and x < 8 and y >= 0 and y < 8 and sol[x][y] == -1
def knightsTour(x,y,move,sol,xMove, yMove):
if move == 8*8 :
return True
#trying all moves from the current coordinate
for k in range(8):
x = x+xMove[k]
y = y+yMove[k]
if safe(x,y,sol):
sol[x][y] = move
if knightsTour(x,y,move+1,sol,xMove,yMove): #calling recursively
return True
else :
sol[x][y] = -1 #backtracking
return False
sol = [[-1 for i in range(8)]for j in range(8)]
sol[0][0] = 0
xMove = [2,1,-1,-2,-2,-1,1,2]
yMove = [1,2,2,1,-1,-2,-2,-1]
print knightsTour(0,0,1,sol,xMove,yMove)
答案 0 :(得分:4)
那个人花了我一段时间才发现。错误是您在x
循环的每次迭代中修改y
和for k in range(8)
,即使新位置不安全或最终不能作为成功骑士之旅的起始位置。 x
和y
表示您当前的起始位置,不应更改!
您的评论
#trying all moves from the current coordinate
显示你想要做什么,但你实际做的是尝试移动,如果新位置不是保存或不作为成功骑士之旅的起始位置,请尝试从新位置转移另一个位置当前坐标(即调用函数的x
和y
值)。
您的代码需要一个简单的修复(请注意注释):
def knightsTour(x,y,move,sol,xMove, yMove):
if move == 8*8 :
return True
#trying all moves from the current coordinate
for k in range(8):
new_x = x+xMove[k] # don't modify x!
new_y = y+yMove[k] # don't modify y!
if safe(new_x,new_y,sol): # call with candidate values
sol[new_x][new_y] = move # mark candidate values on board
if knightsTour(new_x,new_y,move+1,sol,xMove,yMove): # call with candidate values
return True
else :
sol[new_x][new_y] = -1 # reset candidate values
return False