繁体   English   中英

骑士巡回赛(无法解决奇怪的棋盘尺寸)

[英]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已经确保它返回的所有坐标在网格上都为-1 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM