【发布时间】:2019-08-06 08:06:00
【问题描述】:
我想解决 Knight's Tour 并想出了以下程序。即使它似乎没有在任何地方陷入无限循环,它也永远不会给出解决方案(即使给定 2 小时的时间)。
我用 4x4 板(填充一个空格)进行了尝试,因为我知道解决方案,并且代码给出了正确的解决方案,没有任何问题。
from __future__ import print_function
实现回溯算法的递归函数:
def moveKnight(boolBoard, i, j, moveNo, previousMoves):
if moveNo == 63:
previousMoves.pop(0)
print('Success! The moves of the brave Knight are:')
for i in previousMoves:
print(i, end = '\t')
return True
possMoves = possibleMoves(boolBoard, i, j)
for nextMove in possMoves:
previousMoves.append(nextMove)
boolBoard[nextMove[0]][nextMove[1]] = False
if moveKnight(boolBoard, nextMove[0], nextMove[1], moveNo+1, previousMoves):
return True
previousMoves.remove(nextMove)
boolBoard[nextMove[0]][nextMove[1]] = True
return False
根据马的位置和棋盘找出马的所有可能动作的功能:
def possibleMoves(boolBoard, posr, posc):
possMoves = [[]]
if posr + 2 < 8 and posc + 1 < 8:
if boolBoard[posr+2][posc+1]:
possMoves.append([posr+2, posc+1])
if posr+2 < 8 and posc - 1 >= 0:
if boolBoard[posr+2][posc-1]:
possMoves.append([posr+2, posc-1])
if posr+1 < 8 and posc + 2 < 8:
if boolBoard[posr+1][posc+2]:
possMoves.append([posr+1, posc+2])
if posr-1 >= 0 and posc+2 < 8:
if boolBoard[posr-1][posc+2]:
possMoves.append([posr-1, posc+2])
if posr-2>=0 and posc + 1 < 8:
if boolBoard[posr-2][posc+1]:
possMoves.append([posr-2, posc+1])
if posr - 2 >= 0 and posc - 1 >= 0:
if boolBoard[posr-2][posc-1]:
possMoves.append([posr-2, posc-1])
if posr - 1 >= 0 and posc - 2 >= 0:
if boolBoard[posr-1][posc-2]:
possMoves.append([posr-1, posc-2])
if posr + 1 < 8 and posc - 2 >= 0:
if boolBoard[posr+1][posc-2]:
possMoves.append([posr+1, posc-2])
possMoves.pop(0)
return possMoves
主要功能:
if __name__ == '__main__':
boolBoard = [[True]*8]*8
for i in range(0, 8):
boolBoard[i] = [True, True, True, True, True, True, True, True]
previousMoves = [[]]
boolBoard[0][0] = False
if not moveKnight(boolBoard, 0, 0, 0, previousMoves):
print('Not Possible Bro...')
【问题讨论】:
-
计数到 moveNo 到 63 的逻辑是什么
-
在你的代码中添加一些跟踪,这样你就可以检查它在执行过程中做了什么。
-
@VikrantPawar 当骑士在船上时,我从 moveNo = 0 开始[0][0]。因此,我认为在最后一步中,moveNo 将是 63
标签: python backtracking knights-tour