问题描述
我正在尝试编写一个Python程序,该程序将通过回溯来解决Knight's Tour的问题。对于那些不熟悉的人: “骑士被放置在一个空棋盘的第一个正方形上,并且根据象棋规则移动,必须在每个正方形上恰好访问一次。”
我的代码大部分有效,但不完全有效。通常它得到第七步,然后返回未完成的棋盘。为什么?
board = [
[0,0],[0,0]]
def move(x,y,count,move_x,move_y):
if count == len(board)**2:
return True
for i in range(8):
if is_valid(x + int(move_x[i]),y + int(move_y[i]),board):
if move(x + move_x[i],y + move_y[i],count + 1,move_y):
board[x][y] = count
return True
return False
def print_board(bo):
for i in range(len(bo)):
for j in range(len(bo[0])):
if j == (len(board[0]) - 1):
print(bo[i][j])
else:
print(bo[i][j],end = " ")
def is_valid(x,board):
if x >= 0 and y >= 0 and x < len(board) and y < len(board) and board[x][y] == 0:
return True
return False
def solve(bo):
print_board(board)
move_x = [1,2,1,-1,-2,-1]
move_y = [2,2]
counter = 1
x_loc = 0
y_loc = 0
if not(move(x_loc,y_loc,counter,move_y)):
print("No solution")
else:
print(" ")
print_board(board)
solve(board)
解决方法
- 对
move()
的递归调用应在设置board[x][y] = count
之后进行。- 此外,如果
move()
返回false,那么您应该拥有board[x][y] = 0
- 此外,如果
- 实际上,
count
不需要存储在每个板单元中。它只需要在每个递归调用中传递并递增。您可以使用布尔值指示是否已访问过某个单元格。 - 最后的想法:有2 ^ 64个板状态,还有更多路径可以反复达到故障状态。因此,故障状态应存储在哈希中,以避免重复搜索故障路径。