扫雷舰邻居计数
Minesweeper neighbor count
我正在尝试复制扫雷器,但我在计算作为地雷的邻居时遇到了问题。这似乎是一件非常容易实现的事情,但由于某种原因,我并没有在任何地方都得到想要的结果。我有一个代表每个瓷砖的 1d 整数数组。我想要一种方法来分别获得瓷砖的每个邻居,因为它可以具有可变的网格大小。我的代码如下所示:
int num = 0;
if (i + 1 < 16 && graph[i + 1] == -1)
num++;
if (i - 1 >= 0 && graph[i - 1] == -1)
num++;
if (i + 3 < 16 && graph[i + 3] == -1)
num++;
if (i - 3 >= 0 && graph[i - 3] == -1)
num++;
if (i + 4 < 16 && graph[i + 4] == -1)
num++;
if (i - 4 >= 0 && graph[i - 4] == -1)
num++;
if (i + 5 < 16 && graph[i + 5] == -1)
num++;
if (i - 5 >= 0 && graph[i - 5] == -1)
num++;
return num;
而且我没有得到最左边和最右边磁贴想要的结果。有时最下方和最上面的瓷砖也存在问题。我的代码使用固定大小为 4x4(int[16])的网格(显然我称之为图形 :))。
提前谢谢。
您的条件不正确。如果玩家在网格的右边缘,那么 i-3 将是网格的左侧。
为了解决这个问题,你可以添加额外的检查,看看你是否处于边缘。
例如if (i - 3 >= 0 && (i+1) % 4 > 0 && graph[i - 3] == -1)
num++;
您需要对大多数其他 if 语句进行类似的检查(除了 +/- 4)。
我认为错误来自您认为数据的存储方式与实际存储方式。如果我理解正确,您的代码片段当前查看与您的第 i
位置在同一行(或可能列)上的几个邻居。
这个答案包含了关于如何将 2D 网格线性化为 1D 数组的良好解释: 将 2D 数组索引转换为 1D 索引
或者,使用 2D 数组(或者更好的是,std::vector<std::vector<int> >
可能会使事情更清晰、更不容易出错。在这种情况下,性能成本可以忽略不计。
相关文章:
- 优化在 Z^3 中查找邻居
- 将消息从节点发送到其邻居
- Nanoflann发现邻居提出段错误
- 最近的邻居用nanoflann搜索
- 在 3D 点云、GPU 中查找最近的邻居
- Q学习扫雷行为
- 检查数组的邻居值
- 在 std::set 中找到邻居
- 如何在任意网格上找到顶点的邻居
- 在cgal :: surface_mesh中找到某个原始的邻居
- 活着的邻居细胞未正确计数
- 多线程程序中的K最近的邻居
- 在Boost Graph库中选择给定顶点的随机进出邻居的有效方法
- 生活的游戏邻居检查(更简单的方法可能吗?)
- 加快对图形中邻居的迭代
- 在扫雷板上递归绘制地雷
- 扫雷,我怎么知道有多少个 0 彼此相邻?
- 为什么在使用队列处理扫雷中的相邻单元格时会出现无限循环?
- 如何计算矩阵中的邻居数
- 扫雷舰邻居计数