gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:58:39 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com