骑士的旅行回溯(无法解决奇怪的棋盘尺寸)

时间:2018-01-18 05:06:11

标签: python backtracking recursive-backtracking knights-tour

以下是我用来测试回溯算法以解决骑士游览的代码,而且它无法解决奇怪的电路板尺寸问题。如果有人能指出代码中的错误,我真的很感激。

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

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]

1 个答案:

答案 0 :(得分:0)

您的代码需要关闭您的游览(也就是说,必须可以从最后一个广场移回第一个广场)。

对于所有电路板尺寸,并非总是存在这样的巡回演出。特别是,对于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