Knight's tour-回溯(无法解决奇怪的棋盘尺寸)

Posted

技术标签:

【中文标题】Knight\'s tour-回溯(无法解决奇怪的棋盘尺寸)【英文标题】:Knight's tour- backtracking (unable to solve for odd board sizes)Knight's tour-回溯(无法解决奇怪的棋盘尺寸) 【发布时间】:2018-01-18 05:06:11 【问题描述】:

下面是我用来测试回溯算法以解决骑士之旅的代码,它无法解决奇数板尺寸问题。如果有人能指出代码中的错误,我将不胜感激。

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

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】:

您的代码要求您的游览已关闭(即必须可以从最后一个方格移回第一个方格)。

这种游览并非总是适用于所有板尺寸。特别是对于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 在网格上)。

【讨论】:

感谢您的帮助,我不太了解代码或 python,这节省了一天! :) 你有不和谐的东西吗?我需要一个导师,这对我来说意味着世界:) 我的推特是@igococo。

以上是关于Knight's tour-回溯(无法解决奇怪的棋盘尺寸)的主要内容,如果未能解决你的问题,请参考以下文章

Knight's Tour C++ 使用堆栈

Knight's tour backtrack 实现选择步长数组

繁华模拟赛 奇怪的棋

数独回溯 无效数独

golang tour.golang运动解决方案

如何通过回溯和递归解决数独?