Knight's tour- backtracking(无法解决奇怪的棋盘尺寸)

Knight's tour- backtracking (unable to solve for odd board sizes)

下面是我用来测试回溯算法以解决骑士之旅的代码,它无法解决奇数棋盘大小。如果有人能指出代码中的错误,我将不胜感激。

该代码适用于偶数尺寸的电路板,但无法找到奇数尺寸电路板的解决方案。

def get_valid_moves_warnsdorff(moves, x, y, size):
    valid_moves = [(valid_move, len(get_valid_moves(moves, x + valid_move[0], y + valid_move[1], size))) for valid_move in get_valid_moves(moves, x, y, size)]
    sorted_moves = sorted(valid_moves, key=lambda w: w[1], reverse=False)
    return [move[0] for move in sorted_moves]

您的代码要求您的游览是封闭的(也就是说,必须可以从最后一个方块回到第一个方块)。

并非所有尺寸的电路板都存在这种巡视。特别地,对于M x N板,如果MN都是奇数,则不会有封闭游。

要放宽您的代码要求以便接受公开游览,只需删除这些行:

origin_touchers = get_valid_moves(moves, 0, 0, size)
if (x, y) not in origin_touchers and -1 not in [grid[origin_toucher[0]][origin_toucher[1]] for origin_toucher in origin_touchers]:
    return False

如果您确实想保留封闭游览要求,您可以将那个长条件简化为 if not origin_touchers:。不需要检查 x,y(因为如果你在最后一步,你已经返回 True),也不需要检查网格上的 -1(因为 get_valid_moves 已经确保它 returns 在网格上具有 -1 的所有坐标。