[英]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
已经确保它返回的所有坐标在网格上都为-1
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.