0

作为一些程序生成代码的一部分,我有一个函数可以检查网格中的单元格是否有任何相邻单元格。

网格是一个二维数组,如果它被打印出来,它看起来像这样(# = 单元格和 . = 空,边缘周围的 # 是边框):

 0123456789
0##########
1#........#
2#........#
3#........#
4#........#
5#....##..#
6#........#
7#........#
8#........#
9##########

因此,例如,如果检查单元格 5,5,我的代码将返回 true。

我为检查相邻单元格而编写的代码有效,但没有考虑到它正在检查的单元格是否位于“边缘”(例如 0,0 或 0,1 或 10,10)并且将创建如果它确实检查边缘的单元格,则绑定错误。我不确定如何编写考虑到这一点的代码,任何建议都将不胜感激。

到目前为止,这是我的代码:

public static bool HasNeighbour(int[,] array, int CellX, int CellY)
{

    if (array[CellX + 1, CellY] == 1)
    {
        return true;
    }

    if (array[CellX - 1, CellY] == 1)
    {
        return true;
    }

    if (array[CellX, CellY + 1] == 1)
    {
        return true;
    }

    if (array[CellX, CellY - 1] == 1)
    {
        return true;
    }

    if (array[CellX + 1, CellY + 1] == 1)
    {
        return true;
    }

    if (array[CellX + 1, CellY - 1] == 1)
    {
        return true;
    }

    if (array[CellX - 1, CellY + 1] == 1)
    {
        return true;
    }

    if (array[CellX - 1, CellY - 1] == 1)
    {
        return true;
    }
    return false;
}

另外,我的代码有更高效的版本吗?

谢谢

4

1 回答 1

1

试试这个代码(包括边界检查):

public static bool HasNeighbour(int[,] array, int CellX, int CellY) {
  for (int i = -1; i <= 1; ++i)
    for (int j = -1; j <= 1; ++j)
      if ((i != 0) && (j != 0)) {
        int x = CellX + i;

        if ((x < 0) || (x >= array.GetLength(0)))
          continue;

        int y = CellY + j;

        if ((y < 0) || (y >= array.GetLength(1)))
          continue; 

        if (array[x, y])
          return true;
      }

  return false;
}
于 2013-07-28T14:10:16.987 回答