检查二维数组中相邻正方形的值
Check value of neighbouring squares in 2D array
我正在创建一个带有 2D 数组的简单扫雷板。我想用各自的数字填充"炸弹"周围的方块。我不需要关心我创建的董事会是否可以解决。(这里不重要)
我的问题是:我们如何才能优雅地填充数字,而不列出所有的可能性,就好像我们在硬编码一样?
我现在得出的是一个巨大的嵌套 if 语句,用于检查邻居是否
-Inside bounds of array
-Is it a bomb
-Is it empty
-Is it already a number
它看起来非常长且硬编码。
有没有一种简单而优雅的方法来检查二维矩阵中邻居的值?
我意识到在 Python 语言中 SO 中也有类似的问题,那里的解决方案非常"pythonic"。我正在寻找一种简单的方法,只需在简单的 2D 数组上使用简单的结构(循环、if 语句等)。
想象一下,这个任务是交给一个只知道if语句和循环等基础知识的编程新学生的。因此,应避免使用lambda,递归,迭代器等建议的解决方案。
检查邻居时复杂性的主要原因是边界。 例如,如果您在第一行的单元格中,则不想检查上面的三个邻居,因为它们将在数组之外。
有几种常见的方法可以消除边界检查。 假设你有一个带有如下接口的类:
class Board {
public:
bool IsBomb(int row, int col) const;
int GetCount(int row, int col) const;
...
};
您可以在 IsBomb
方法的实现中隐藏边界检查。 例如,如果使用在游戏场之外的坐标调用IsBomb
,它应该返回false
,而不是实际查找数组(或任何存储机制)。 现在,GetCount
可以简单地为所有八个邻居调用IsBomb,而不必担心这些邻居中的任何一个是否不在运动场的边缘。 这就是数据抽象方法。
另一种方法是使电路板在各个侧面都更大,但只穿过内部方块。 然后,您无需检查相邻的正方形是否在边界内。 这将是隐藏在 Board 方法中的实现细节。 它与第一种方法完全兼容。
还有其他技巧可以避免循环中的边界检查,例如将棋盘分为九种特殊情况(角、边缘和中间),但对于像扫雷游戏这样的游戏来说,这将是矫枉过正的。 它不会降低复杂性;这主要是为了在某些极端情况下的性能。
for(int x =0; x<numRows; x++){
for(int y = 0; y<numCols; y++){
if(array[x][y] != "bomb"){
array[x][y] = number
}
}
}
最好的方法是循环浏览每个索引并检查是否有炸弹。如果没有,请添加一个数字。第一个 for 循环遍历每一行,然后下一个 for 循环遍历每一列。因此,您将检查第 1 行与第 1 列、第 2 列、第 3 列等。然后,一旦第 1 行完成,就移动到第 2 行并检查与列 1、列 2 等,直到搜索完每个位置。
- 将值从二维数组输出到文本文件
- 在二维数组中查找最小值和最大值?
- 移动二维数组中的字符
- 如何正确填充在堆上分配的二维数组?
- 传递二维数组时出现问题
- 具有随机数的二维数组不会更改
- 如何在C++中获取二维数组中最少的一列数?
- 如何使用用户输入变量制作二维数组?
- C++ 中动态二维数组的访问冲突
- 遍历二维数组的所有子数组
- 将二维数组的所有元素插入到一维数组中
- 在函数中传递二维数组
- 为什么指针在对二维数组进行排序时无法正常工作?
- 创建 std::string 的二维数组的最佳做法
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 元素在二维数组 c++ 中的出现次数
- 执行 c++ 二维数组
- C++ 中的二维数组初始化为一个值
- 在C++中初始化第一维大小未知的二维数组
- 检查二维数组中相邻正方形的值