检查二维数组中相邻正方形的值

Check value of neighbouring squares in 2D array

本文关键字:正方形 二维数组 检查      更新时间:2023-10-16

我正在创建一个带有 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 等,直到搜索完每个位置。