algorithm - 在半径增加的二维网格中查找相邻单元格
问题描述
假设有一个二维网格,其中 X 是要检查的单元格,T 是满足给定单元格 X 的检查标准的单元格。
+---+---+---+---+---+
| T | | | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | | X | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
现在我想通过以下方式搜索找到最接近 X 且满足条件(本例中为 T)的单元格,其中数字表示要按升序检查的单元格:
+---+---+---+---+---+
| 11| | | | |
+---+---+---+---+---+
| 10| 1 | 2 | 3 | |
+---+---+---+---+---+
| 9 | 0 | X | 4 | |
+---+---+---+---+---+
| 8 | 7 | 6 | 5 | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
硬编码从 X-Cell 偏移的简单方法不起作用,因为 T 和 X 之间的距离是任意的。那么如果没有前一种方法,我该如何归档呢?
解决方案
如果你想获得邻居,有一个简单的算法如下所示。半径将指定您将获得多少个邻居,并且可以非常简单地增加它。它将从上到下从左到右。有了数据,只需循环抛出每个邻居并获取相距-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));
}
}
}
推荐阅读
- java - Java 类直接实例化而不调用构造函数?
- python - TensorFlow GPU 不工作,如何安装?
- java - 在 Android Studio 中的应用启动时加载插页式广告
- android - 单击或点击“编辑文本”时如何显示和反转我的动画?
- azure - 使用 Azure 应用程序网关后面的 CNAME 访问 azure webapp
- jquery - 创建日记应用。本地存储有问题
- python - python 谷歌识别仅适用于葡萄牙语不适用于英语
- ios - 命令 PhaseScriptExecution 失败,退出代码为非零 I
- karate - 动态场景大纲 | 找不到文件时空手道挂起
- c++ - C++:重构管理命名空间