我正在尝试计算靠近单元格的邻居,但是代码仅适用于中间单元,而不适用于角落单元,为此我可以使用许多if循环,但是我想知道它如何与for和if循环一起使用
我尝试创建额外的if循环或编写类似row == 0等的内容,但是一切似乎都给了我错误的答案。 btw bool [,]网格的值为false和true。并且我们需要计算给定行/列中有多少对错。
public static int CountNeighbours(bool[,] grid, int row, int col)
{
int total = 0;
for (int i = row - 1; i < row + 2; i++)
{
for (int j = col - 1; j < col + 2; j++)
{
if (grid[i, j] == grid[row, col])
{
total += 1;
}
}
}
Console.WriteLine("total neighbours for row {0} and column {1}: {2}",row,col,total-1);
return total-1;
}
结果应该为角和行给出完美的答案。
答案 0 :(得分:1)
您的问题是您将单元格本身视为自己的邻居,而没有检查网格的边界。
像这样更改循环条件:
for (int i = Math.Max(0, row - 1); i < row + 2 && i < grid.GetLength(0); i++)
{
for (int j = Math.Max(0, col - 1); j < col + 2 && j < grid.GetLength(1); j++)
{
if (i == row && j == col) continue; // skip current cell
因此,对于Math.Max()
,请确保不要使用负 i
或j
,因为那样会导致IndexOutOfRangeException
。
使用grid.GetLength()
可以得到各个维度的数组大小,因为使用大于或等于该长度的i
或j
会再次引发IndexOutOfRangeException
。
最后,最后一行检查您是否不对相关单元格进行计数。