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
板,如果M
和N
都是奇数,则不会有封闭游。
要放宽您的代码要求以便接受公开游览,只需删除这些行:
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
的所有坐标。
下面是我用来测试回溯算法以解决骑士之旅的代码,它无法解决奇数棋盘大小。如果有人能指出代码中的错误,我将不胜感激。
该代码适用于偶数尺寸的电路板,但无法找到奇数尺寸电路板的解决方案。
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
板,如果M
和N
都是奇数,则不会有封闭游。
要放宽您的代码要求以便接受公开游览,只需删除这些行:
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
的所有坐标。