如果我们将单元格坐标视为row
and column
,您可以通过查看我们正在搜索的单元格的上一行、同一行和下一行,以及之前的列、同一列和之后的列来获取邻居。
为了获得这些值,我们只需设置minRow = cell.Row - 1
, maxRow = cell.Row + 1
, minCol = cell.Col - 1
and maxCol = cell.Col + 1
(当然,我们必须检查网格的边界,以确保我们不会离开任何一边,并且我们不会返回其Row
and Col
与我们正在检查的单元格相同),并且我们使用这些坐标返回网格中的所有项目。
例如:
private static List<T> GetNeighbors<T>(int cellRow, int cellCol, T[,] grid)
{
var minRow = cellRow == 0 ? 0 : cellRow - 1;
var maxRow = cellRow == grid.GetUpperBound(0) ? cellRow : cellRow + 1;
var minCol = cellCol == 0 ? 0 : cellCol - 1;
var maxCol = cellCol == grid.GetUpperBound(1) ? cellCol : cellCol + 1;
var results = new List<T>();
for (int row = minRow; row <= maxRow; row++)
{
for (int col = minCol; col <= maxCol; col++)
{
if (row == cellRow && col == cellCol) continue;
results.Add(grid[row, col]);
}
}
return results;
}
实际上,它可能看起来像这样:
private static void Main()
{
var grid = GetSquareGrid(10);
var neighbors = GetNeighbors(4, 5, grid);
Console.Write($"Neighbors of [4,5] are: ");
Console.Write(string.Join(",", neighbors.Select(n => $"[{n.X},{n.Y}]")));
GetKeyFromUser("\n\nDone! Press any key to exit...");
}
private static Point[,] GetSquareGrid(int size)
{
var result = new Point[size, size];
for (int row = 0; row < size; row++)
{
for (int col = 0; col < size; col++)
{
result[row, col] = new Point(row, col);
}
}
return result;
}
Output: