表示地理表面地形图的二维数组算法

时间:2015-06-26 05:03:57

标签: c multidimensional-array data-structures graph-algorithm dijkstra

我很难搞清楚如何解决以下问题

输入将是2D数组A [n] [n]数字,表示地理表面的地形图。输入中还将是起始位置(r,c)。参考条目A [r] [c]

如果您计划远足径,您将受到相邻条目之间的高度差异的约束。如果一个人的高度相差不超过2,则可以在两个相邻位置之间穿越。邻接仅遵循4个标准指南针方向,(因此我假设没有对角线)。因此,如果地图上的点可以从A [r] [c]到任何序列,可以被认为是可到达的。相邻的。

编写一个计算所有可到达位置的算法。输出将是具有true / fals值的另一个2D数组R [n] [n]。 (我假设true表示可达,false表示无法访问)

如果我正确理解了这个问题,我可以创建以下矩阵。 (假设A [10] [10]从A [0] [0]看起来像这样:)

50 51 54 58 60 60 60 63 68 71

48 52 51 59 60 60 63 63 69 70

44 48 52 55 58 61 64 64 66 69

44 46 53 52 57 60 60 61 65 68

42 45 50 54 59 61 63 63 66 70

38 42 46 56 56 63 64 61 64 62

36 40 44 50 58 60 66 65 62 61

36 39 42 49 56 62 67 66 65 60

30 36 40 47 50 64 64 63 62 60

50 50 50 50 50 50 50 50 50 50

南部和东部都可以从A [0] [0]遍历,因此可以访问的条目是:

50 51 54 58 60 60 60 63 68 71

48 52 51 59 60 60 63 63 69 70

44 48 52 55 58 61 64 64 66 69

44 46 53 52 57 60 60 61 65 68

42 45 50 54 59 61 63 63 66 70

38 42 46 56 56 63 64 61 64 62

36 40 44 50 58 60 66 65 62 61

36 39 42 49 56 62 67 66 65 60

30 36 40 47 50 64 64 63 62 60

50 50 50 50 50 50 50 50 50 50

所以我可以断定我的结果数组应该是

1 1 0 0 0 0 0 1 0 0

1 1 1 0 0 0 1 1 0 0

0 0 1 0 0 0 1 1 1 0

0 0 1 1 0 0 0 0 1 0

0 0 0 1 0 0 0 0 1 0

0 0 0 1 1 0 0 0 1 1

0 0 0 0 1 1 0 0 1 1

0 0 0 0 1 1 0 0 0 1

0 0 0 0 0 1 1 1 1 1

0 0 0 0 0 0 0 0 0 0

我想在c代码中实现这个,但我认为在这里要求代码是不合适的。我的计划是首先用伪代码实现这个,然后用c代码实现,我将尝试自己做=)。我不知道从哪里开始我的伪代码。有人可以澄清一下吗?

非常感谢!

p.s刚编辑了我的矩阵

1 个答案:

答案 0 :(得分:3)

查看在这种情况下使用的DijkstraA-Star。您还可以查看图论基础知识,以便创建适当的matrics表示。

此外,在您的情况下,您可能需要Manhatten Distance作为A-Star的启发式

如果你深入研究图论和搜索算法的主题,还有很多其他的算法。

由于评论而编辑:

您还可以使用Depth First Search (DFS)Breadth First Search (BFS)。这些算法在开始时更容易实现。

首先,您需要创建一个代表hightmap的适当数据结构。这些结构可能如下所示:

struct Vertex 
     int x                 // coordinate x
     int y                 // coordinate y
     Vertex neighbors[8]; // Array of all adjacent vertices 
     int height            // height
}

之后,您可以使用以下伪代码作为从Breadth first search and depth first search获取的提案 已经知道图中的周期,这将导致无限循环。

 dfs(vertex v) {
    visit(v); 
    for each neighbor w of v            
        if w is unvisited **and reachable** // reachable according to your hight differences
        {
        dfs(w); // recursive call to the dfs 
        add edge vw to tree T  //tree contains a result path in your
                               //case the second matrix
        }
    }

伪代码中缺少一些步骤。例如,条件 在访问目标时放弃DFS。

一些补充说明:

  • DFS将为您的问题找到解决方案
  • Dijkstra A-Star 会找到问题的最短(最佳)解决方案(从开始到目标的最短路径,考虑到顶点的高度< / LI>