以下是我用来测试回溯算法以解决骑士游览的代码,而且它无法解决奇怪的电路板尺寸问题。如果有人能指出代码中的错误,我真的很感激。
该代码适用于尺寸均匀的电路板,但无法找到奇数尺寸电路板的解决方案。
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]
答案 0 :(得分:0)
您的代码需要关闭您的游览(也就是说,必须可以从最后一个广场移回第一个广场)。
对于所有电路板尺寸,并非总是存在这样的巡回演出。特别是,对于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
。