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