作为一些程序生成代码的一部分,我有一个函数来检查网格中的单元格是否有任何相邻单元格。
网格是一个2D数组,如果它被打印出来,它看起来像这样(#= cell和。= empty,边缘周围的#是边框):
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;
}
此外,我的代码是否有更高效的版本?
由于
答案 0 :(得分: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;
}