我遇到了一个问题,我想在我的家庭作业中增加一点特色,结果却让我不知所措(阅读粗体句子来回答没有上下文的问题)。
我的程序中有一个大约35个项目的列表,其中包含了关于我应该使用的地图的信息。它可以包含以下元素:
“墙”及其坐标(X,Y),在dijkstra中应该有100磅重。
“树”,带绳索(x,y),重量3
我有一张10×10的地图,就像棋盘一样,意味着100块瓷砖和35件物品。”列表中的“nothing”表示dijkstra中的权重1(表示正常路线)
为了使dijkstra工作并且能够在两个tile之间找到最短路径,我必须构建一个邻接图。我的问题是,如何定义当前磁贴周围的磁贴,如果我只有这个列表?
只有形状为“+”的相邻平铺在它们之间的关系图中才有边,但我每次都必须遍历列表以检查是否有内容?
关于这个问题的任何线索都将非常感谢,如果你能给我指一个有代码示例的源代码,也可以这样做。我只看到了非常混乱的代码,其中有很多“if elseif elseif…”来解决这个问题。
谢谢你抽出时间!
编辑:我最后使用了@kraskevich的建议方法,效果非常好,但是所有的答案和建议都非常有用,非常感谢大家!

最佳答案

你不需要建立一个图表只需创建一个10x10表并将相应项的权重放入其中:

board = 10x10 array filled with 1
for item in list:
    if item is a tree:
         board[item.row][item.column] = 3
    else if item is a wall:
         board[item.row][item.column] = 100

之后,可以将坐标对(row, col)视为顶点,并在处理平铺时更新4个相邻单元格的距离就这样。当然,您也可以创建一个有100个顶点的图,并将一个平铺的边显式地添加到所有4个相邻的单元格中(权重是边平铺末端的权重),然后使用标准实现。
在相邻单元格上迭代最方便的方法如下:
delta_rows = [-1, 1, 0, 0]
delta_cols = [0, 0, -1, 1]
...
for direction = 0 .. 3
     new_row = row + delta_rows[direction]
     new_col = col + delta_cols[direction]
     if is_valid(new_row, new_col)
          // do something

关于algorithm - 在棋盘外建立邻接图(用于dijkstra),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44335382/

10-12 19:15