带回溯的骑士​​之旅

问题描述

我正在尝试编写一个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个板状态,还有更多路径可以反复达到故障状态。因此,故障状态应存储在哈希中,以避免重复搜索故障路径。