由于网格转换,迷宫在测试用例上遇到错误



我的BFS迷宫通过使用邻居解决迷宫并使用BFS评估邻居,在它自己的类中正常工作。我有提供给我的测试用例,我无法更改,但我的测试未通过所有示例测试,我不明白。

最初,我认为我的问题在于网格组件(如(1,0)(0,1)(之间的转换,以str方向(如N表示北方(,因为测试只检查正确的str方向,而不是网格。我花了很长时间测试翻译(与这里的某人合作(,但现在我确定问题出在其他地方,但我不知道在哪里。

这是我的BFS迷宫求解器:

def moves(self):
moves = list()
dir_to_str = {
(-1, 0): 'W',
(1, 0): 'E',
(0, -1): 'S',
(0, 1): 'N',
}
(r, c) = self.location
for (dr, dc) in [(-1, 0), (1, 0), (0, -1), (0, 1)]:  # up, down, left, right
if self.grid[r + dr][c + dc] != 'X':
moves.append(dir_to_str[(dr, dc)])
return moves

它将在使用BFS成功穿越迷宫时打印代理。

问题是当我将其导入 BFS 测试用例(我无法更改(时。所有测试均未通过。每个人都得到一个我不明白的错误,以下是失败:

Ran 3 tests in 0.044s
FAILED (failures=3)

['S',
'S',
'E',
'E',
'E',
'E',
'E',
'E',
'S',
'S',
'E',
'E',
'E',
'E',
'E',
'S',
'S',
'S',
'E',
'E',
'S',
'E',
'E',
'S',
'S',
'S',
'S',
'S',
'E',
'E',
'S',
'S',
'S',
'S',
'S'] != ['E',
'E',
'N',
'N',
'E',
'E',
'N',
'N',
'E',
'E',
'N',
'N',
'N',
'E',
'N',
'N',
'N',
'N',
'N',
'N',
'E',
'N',
'N',
'E',
'E',
'E',
'E',
'E',
'N',
'N',
'E',
'E',
'E',
'E',
'E']

混合行和列是使用网格的常见错误。数据结构dir_to_str与代码的其余部分不匹配,因为它使用第一个元组元素作为列(水平/x 轴(。

改变:

dir_to_str = {
(-1, 0): 'W',
(1, 0): 'E',
(0, -1): 'S',
(0, 1): 'N',
}

dir_to_str = {
(-1, 0): 'N',
(1, 0): 'S',
(0, -1): 'W',
(0, 1): 'E',
}

由此产生的path变为:

[">

S"、"S"、"E"、"E"、"S"、"S"、"E"、"E"、"S"、"S"、"E"、"E"、"S"、"E"、"S这仍然与输出不匹配,因为代码采用的路由与测试套件略有不同。

您可以通过更改搜索优先级来解决此问题:

for (dr, dc) in [(-1, 0), (1, 0), (0, -1), (0, 1)]:

成为

for dr, dc in [(0, 1), (-1, 0), (1, 0), (0, -1)]:  # east first

然后你得到

["S"、">

S"、"E"、"S"、"S"、"E"、"S"、"E"、"S"、"E"、"S"、"S"、"E"、"S"、"E"、"S"、"S完成所有这些之后,我建议进行重构以删除分散在整个代码中的硬编码文本。通过将方向逻辑集中到整个类的一个数据结构中,它使这样的错误更容易避免和查找。

最新更新