【发布时间】:2014-04-03 18:22:25
【问题描述】:
我正在创建一个带有 2D 阵列的简单扫雷板。我想用各自的数字填充“炸弹”周围的方块。 我不需要关心我创建的板是否可以解决。 (这里不重要)
我的问题是:我们如何才能优雅地填充数字而不像硬编码一样列出所有可能性?
我现在想出的是一个巨大的嵌套 if 语句来检查邻居是否是
-Inside bounds of array
-Is it a bomb
-Is it empty
-Is it already a number
它看起来非常长并且是硬编码的。
有没有一种简单而优雅的方法来检查二维矩阵中邻居的值?
我意识到在用 Python 语言询问 SO 中有类似的问题,那里的解决方案非常“pythonic”。我正在寻找一种简单的方法,只需在一个简单的二维数组上使用简单的结构,如(循环、if 语句等)。
想象一下,这个任务是交给一个只知道 if 语句和循环等基础知识的编程新学生。因此,应避免使用 lambda、递归、迭代器等建议的解决方案。
【问题讨论】:
-
你不能只遍历炸弹并在每个炸弹周围的 8 个单元中增加一个计数器吗?当然,您仍然需要进行适当的边界检查,以免尝试访问不存在的单元格。
-
@mhj 这就是我的观点。但是,如果不列出所有可能性,你怎么做呢?目前我列出了所有方向 - NW,N,NE,W,E,SW,S,SE。一个长嵌套的 if 解决方案,我正在寻找用循环或简单的东西替换它的方法。
-
好吧,我假设您知道二维数组中炸弹位置的 x 和 y 索引。所以找到它们相邻的 8 个单元只需要访问 index[x-1][y-1] (NW), index[x][y-1] (N), index[x+1][y-1 ] (NE)、index[x-1][y] (W) 等等。您只需为每个炸弹执行一次,因此无需遍历整个网格。
-
@Mhj 对不起,如果我没有明确指定我的问题。目前我已经在检查炸弹的邻居了。但我正在寻找简化邻居检查算法的方法。
-
我想我会建议一种不同的方法。从一个空板开始 - 每个条目都是 0。然后迭代你想要放置的炸弹数量 - 对于每个炸弹,选择一个随机位置,检查碰撞并重新拾取,直到你有一个没有炸弹的地方前。然后在该单元格中放置一个“炸弹”值,并增加(最多)八个不是炸弹的邻居的计数。这可能比尝试后处理步骤更简单。此外,在 10x10 阵列的中心放置一个 8x8 网格以避免边界复杂化...