我正在创建一个带有二维数组的简单扫雷板。我想用相应的数字填充“炸弹”周围的方 block 。 我不需要关心我创建的板是否可以解决。 (这里不重要)
我的问题是:我们如何在不列出所有可能性的情况下优雅地填充数字,就好像我们是硬编码一样?
我现在想出的是一个巨大的嵌套 if 语句来检查邻居是否是
-Inside bounds of array
-Is it a bomb
-Is it empty
-Is it already a number
它看起来非常长而且硬编码。
有没有一种简单而优雅的方法来检查二维矩阵中邻居的值?
我意识到在用 Python 语言的 SO 中也有类似的问题,那里的解决方案非常“pythonic”。我正在寻找一种简单的方法,只需在简单的二维数组上使用简单的结构(循环、if 语句等)。
想象一下,这个任务是交给一个只知道 if 语句和循环等基础知识的编程新手。因此应避免使用 lambda、递归、迭代器等建议的解决方案。
最佳答案
检查邻居时复杂性的一个主要原因是边界。例如,如果您在第一行的一个单元格中,您不想检查上面的三个邻居,因为它们会在数组之外。
有几种常见的方法可以消除边界检查。假设您有一个具有如下接口(interface)的类:
class Board {
public:
bool IsBomb(int row, int col) const;
int GetCount(int row, int col) const;
...
};
您可以在IsBomb
方法的实现中隐藏边界检查。例如,如果您调用 IsBomb
时使用的坐标位于游戏场之外,则它应该返回 false
而不是实际查看数组(或任何您的存储机制)。现在 GetCount
可以简单地为所有八个邻居调用 IsBomb,而不用担心这些邻居中的任何一个是否超出了运动场的边缘。这就是数据抽象方法。
另一种方法是使棋盘的各个面都变大,但只在内部方 block 中循环。然后你不需要检查相邻的方 block 是否在边界内。这将是您隐藏在 Board 方法中的实现细节。它与第一种方法完全兼容。
还有其他技巧可以避免循环中的边界检查,例如将棋盘分成九个特殊情况(角落、边缘和中间),但这对于像扫雷游戏这样的游戏来说太过分了。而且它不会降低复杂性;在某些极端情况下,这主要是为了提高性能。
关于c++ - 检查二维数组中相邻方 block 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22845852/