由于网格转换,测试用例出现错误

2024-04-25 03:44:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我的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']

Tags: toinself网格dir组件测试用例dc
1条回答
网友
1楼 · 发布于 2024-04-25 03:44:00

在使用网格时,混淆行和列是一个常见的错误。数据结构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”,“E”,“E”,“E”,“E”,“E”,“E”,“E”,“E”,“E”,“S”,“S”,“S”,“S”,“S”,“E”,“E”,“E”,“S”,“S”,“S”,“S”,“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'、'E'、'E'、'E'、'E'、'S'、'S'、'E'、'E'、'E'、'E'、'S'、'S'、'E'、'E'、'E'、'E'、'S'、'S'、'E'、'E'、'E'、'E'、'E'、'S'、'S'、'S'、'S'、'S'、

在所有这些之后,我建议进行重构,以删除散落在代码中的hard-coded literals。通过将定向逻辑集中到整个类的一个数据结构中,可以更容易地避免和查找此类错误。你知道吗

相关问题 更多 >