【问题标题】:Find node neighbors in 2d array在二维数组中查找节点邻居
【发布时间】:2015-11-22 12:11:09
【问题描述】:

假设我有以下 (n * n) 数组:

1 2 3 4
5 6 7 8
9 a b c
d e f g

我想编写一个函数来查找给定节点的邻居节点。例如,对于节点 1,它将返回一个包含 2、6 和 5 的数组。对于节点“a”,它将返回一个包含节点 5、6、7、b、f、e、d 和 9 的向量。顺序无关紧要。我试图只使用 if 语句来做到这一点,但它很快就变成了一场噩梦。

解决这个问题的最佳方法是什么?

【问题讨论】:

  • 你可以很容易地用少量的 if 语句来做到这一点。请使用您尝试过的代码更新您的问题,人们将更有能力为您提供帮助。
  • @KLibby 使用 4 个 if 语句用于极端情况,4 个 if 语句用于边界情况,当我在数组中有一个元素时使用 1 个 if 语句,当我有 2 * 2 时使用 4 个数组。

标签: java


【解决方案1】:
// assume (x,y) is position in array you want to get neighbours from
// assume 'array' is your array with x first and then y
// assume T is type of your array stuff

ArrayList<T> list = new ArrayList<T>();

for (int i = x - 1; i <= x + 1; i++) {
    for (int j = y - 1; j <= y + 1; j++) {
        // check if (i,j) is in array bounds
        if (i >= 0 && j >= 0 && i < array.length() && j < array[i].length()) {
            // the point isn't its own neighbour
            if (i != x && j != y)
                list.add(array[i][j]);
        }
    }
}
return list.toArray();

编辑:由于您的数组是 n*n 大,您不必使用 array.length(),但这样它适用于所有类型的数组。

【讨论】:

  • 最好鼓励 OP 自己解决问题,必要时给予提示。为他们工作意味着当他们可以剪切和粘贴其他人的代码时,他们不会学到任何解决问题的方法。
【解决方案2】:

你可以使用 for 循环,假设 (i,j) 是你的元素的位置,mat 是你的数组

mat[n][n]
int res[8];
int x = 0;
for (int k = i - 1 ; k < 2 ;k++)
    for(int t = j-1 ; j  <2 ;j++)
        if ((k > 0) && (t > 0) && (t<n) && (k < n))
            res[x++] = mat[k][t];

【讨论】:

  • 最好鼓励 OP 自己解决问题,必要时给予提示。为他们工作意味着当他们可以剪切和粘贴其他人的代码时,他们不会学到任何解决问题的方法。