检查2D数组中相邻方块的值

时间:2014-04-03 18:22:25

标签: c++ arrays matrix 2d

我正在创建一个带2D阵列的简单扫雷板。我想用各自的数字填充“Bomb(s)”周围的方块。 我不需要关心我创建的电路板是否可以解决。 (这里不重要)

我的问题是:如何在不列出所有可能性的情况下优雅地填充数字,就好像我们是硬编码一样?

我现在提出的是一个大规模的嵌套if语句来检查邻居是否

 -Inside bounds of array
 -Is it a bomb
 -Is it empty
 -Is it already a number

看起来非常长且硬编码。

有没有一种简单而优雅的方法来检查2D矩阵中邻居的值?

我意识到在Python语言中有类似的问题,那里的解决方案非常“pythonic”。我正在寻找一种简单的方法,只需在简单的二维数组上使用简单的结构,如(循环,if语句等)。

想象一下,这个任务是给编程中的新生,他只知道if-statements和循环等基础知识。因此应避免使用lambda,递归,迭代器等建议的解决方案。

2 个答案:

答案 0 :(得分:1)

检查邻居时复杂性的主要原因是边界。例如,如果您位于第一行的单元格中,则不想检查上面的三个邻居,因为它们位于数组之外。

有几种常见的方法可以消除边界检查。我们假设您有一个具有如下界面的类:

class Board {
  public:
    bool IsBomb(int row, int col) const;
    int GetCount(int row, int col) const;
    ...
};

您可以在IsBomb方法的实现中隐藏边界检查。例如,如果您使用位于游戏区域外的坐标调用IsBomb,则应返回false而不是实际查看数组(或任何存储机制)。现在GetCount可以简单地为所有八个邻居调用IsBomb,而不必担心这些邻居是否离开了比赛场边缘。这是数据抽象方法。

另一种方法是使电路板在所有侧面都更大,但只能在内部方块上循环。然后你不需要检查相邻的方块是否在边界内。这将是您隐藏在Board方法中的实现细节。它与第一种方法完全兼容。

还有其他黑客可以避免在循环中进行边界检查,例如将棋盘划分为九个特殊情况(角落,边缘和中间),但对于类似游戏的扫雷而言,这将是过度杀伤。它并没有降低复杂性;在一些极端情况下,这主要是为了表现。

答案 1 :(得分:0)

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列等,直至搜索到每个位置。

相关问题