【发布时间】:2021-04-06 05:25:56
【问题描述】:
基本上这是一个家庭作业,如果你回答我的问题,我更愿意得到答案而不是代码和答案本身。
这必须是一种递归方法,在给定的二维布尔数组中,它必须返回数组中真实区域的数量 - 数组中的行数和列数将始终相同。
真正的区域是在至少有一个真正的元素时定义的,如果它有一个相邻的另一个元素也是如此,它们仍然算作 1。 对角线元素不被视为邻居。
例如,在这个矩阵中,当 1 代表真,0 代表假时,有 3 个真区域 - 左侧的两个单元格,右侧的三个单元格,最后一行的一个单元格,一个人。
1 0 0 1
1 0 1 1
0 1 0 0
我不知道如何递归处理这个问题,我认为在简单的迭代中它会很简单,但似乎不可能使用调用自身的方法检查数组。
有人有线索吗?
【问题讨论】:
-
递归不是回溯。有时回溯计算结构是用递归构建的——比如通过递归构建 n 嵌套循环来执行recursive-backtracking;但递归本身就是一回事。 is 这里有一个 naturally 递归解决方案。至于回溯——即在失败后重试直到成功——我看不出这里需要重试什么。您只需将一件事一分为二,计算每个(或一个?)您感兴趣的问题,然后将两件事加在一起,可能会调整计数。
-
所以如果你坚持递归回溯解决方案,我对没有答案。
-
@WillNess 感谢您的回答。我不需要回溯解决方案,我只是想,因为这是我们研究的最后一件事,它应该是答案,但这不是必需的。
-
尝试将其分成第一行和其余行。以某种方式为其余行生成两件事-第二行顶部的计数和“活动点”。然后将其与第一行结合,并在第一行顶部产生新的计数和新的活动点。那是它似乎可以完成的模糊轮廓。我认为 Judge 的回答也暗示了这种方式,但我不明白为什么它同时谈到垂直和水平分割(或者我误解了它)。
标签: java arrays recursion boolean minesweeper