c++ - 检查二维数组中相邻方 block 的值

标签 c++ arrays matrix 2d

我正在创建一个带有二维数组的简单扫雷板。我想用相应的数字填充“炸弹”周围的方 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/

相关文章:

c++ - 未定义的行为值得吗?

php - 使用 OpenSSL C++ 库和 PHP 的 Blowfish 加密数据不一致

c - 如何将二维数组从最大到最小排序

javascript - 如何在javascript中为多维数组赋值?

C++ Armadillo 稀疏矩阵批量插入

c++ - 我会不会忘记了什么?

c++ - 多个线程可以具有只读访问权限的互斥模式

php - 如何以 'reusable' 的方式将参数传递给数组中的 PDO SELECT 语句?

r - 在 R 中按行到上三角矩阵的向量

c++ - 一个矩阵中的数据自动复制到 C++ 中 opencv 中的另一个矩阵