【问题标题】:Visiting all locations in a multidimensional array directly adjacent to some location?访问与某个位置直接相邻的多维数组中的所有位置?
【发布时间】:2012-01-25 01:14:35
【问题描述】:

我正在做我的第一个算法(A* 寻路),其中一部分涉及检查与不同节点相邻的所有节点。有没有一种快速简便的方法可以做到这一点,还是必须为每个节点手动完成?

编辑:

相邻的意思是:

每个X都与父节点O相邻

XXX  
XOX  
XXX

【问题讨论】:

  • 取决于你的数据结构... :)
  • 您能描述一下相邻节点的确切含义吗?您是指数组中的相邻条目吗?
  • 发布您的代码。很难知道你在说什么。

标签: c++ c arrays multidimensional-array


【解决方案1】:

您可以使用一个不错的双循环:

for (int i = x - 1; i <= x + 1; i++) {
    for (int j = y - 1; j <= y + 1; j++) {
        /* Skip the point itself! */
        if (i == x && j == y) continue;

        /* Process the location here */
    }
}

这也可以概括为仅考虑基本方向相邻的点(即直接上/下/左/右)。为此,您可以使用上述 for 循环的修改,在其中访问所有八个邻居,然后跳过其中一个

  • 与您所在的位置相同(i == x 和 j == y),或者
  • x 和 y 都不是起点(i != x 和 j != y)

有趣的是,以上两个测试可以合并为一行:((i == x) == (j == y))。这将测试两个值是否相同(您在同一个开始的地方)或两个值不同(您在对角线上):

for (int i = x - 1; i <= x + 1; i++) {
    for (int j = y - 1; j <= y + 1; j++) {
        if ((i == x) == (j == y)) continue;

        /* Process the location here */
    }
}

当然,在这两种情况下,您都应该确保自己处于世界范围内,但由于我不知道这些是如何指定的,所以我将把它作为练习留给读者。 :-)

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    二维数组中的相邻条目很容易找到。 array[i][j] 的相邻条目是:

    array[i-1][j-1];
    array[i-1][j];
    array[i-1][j+1];
    array[i][j-1];
    array[i][j+1];
    array[i+1][j-1];
    array[i+1][j];
    array[i+1][j+1];
    

    您可以很容易地推广到更高维的数组。注意不要超出数组的范围!

    【讨论】:

    • 硬编码这些位置容易出错、难以阅读,并且不容易推广到更高的维度。
    • 将偏移量打包到数组中并对其进行迭代也非常方便,省去了双循环的麻烦。
    猜你喜欢
    • 2011-02-12
    • 2014-05-12
    • 1970-01-01
    • 2013-06-27
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    相关资源
    最近更新 更多