首页 > 解决方案 > 在半径增加的二维网格中查找相邻单元格

问题描述

假设有一个二维网格,其中 X 是要检查的单元格,T 是满足给定单元格 X 的检查标准的单元格。

+---+---+---+---+---+
| T |   |   |   |   |
+---+---+---+---+---+
|   |   |   |   |   |
+---+---+---+---+---+
|   |   | X |   |   |
+---+---+---+---+---+
|   |   |   |   |   |
+---+---+---+---+---+
|   |   |   |   |   |
+---+---+---+---+---+

现在我想通过以下方式搜索找到最接近 X 且满足条件(本例中为 T)的单元格,其中数字表示要按升序检查的单元格:

+---+---+---+---+---+
| 11|   |   |   |   |
+---+---+---+---+---+
| 10| 1 | 2 | 3 |   |
+---+---+---+---+---+
| 9 | 0 | X | 4 |   |
+---+---+---+---+---+
| 8 | 7 | 6 | 5 |   |
+---+---+---+---+---+
|   |   |   |   |   |
+---+---+---+---+---+

硬编码从 X-Cell 偏移的简单方法不起作用,因为 T 和 X 之间的距离是任意的。那么如果没有前一种方法,我该如何归档呢?

标签: algorithmsearch

解决方案


如果你想获得邻居,有一个简单的算法如下所示。半径将指定您将获得多少个邻居,并且可以非常简单地增加它。它将从上到下从左到右。有了数据,只需循环抛出每个邻居并获取相距-1的相邻单元格

 List<Node> neighbours = new List<Node>();

  iint currentRadius = 1;
  for(int x = -currentRadius; x <= concurrent; x++)
  {
    for(int y = -currentRadius; y <= concurrent; y++)
    {
      if(x == 0 && y == 0)
        continue; //Dont check itself

      int checkX = pos.x + x;
      int checkY = pos.y + y;

      if(checkX >= 0 && checkX < gridSizeX && checkY >= 0 checkY < gridSizeY) //Check if current pos is not out of bounds
      {
        neighbours.Add(nodes(checkX, checkY));
      }
    }
  }

推荐阅读