我有一个扫描二维阵列的问题,阵列代表一个花园,只有当草被砍伐而不是太高时,你才能踩到花园的草地上。由数字1代表的割草。高草代表数字大于1,数字越大 - 草越高,高度独特。在这个花园里,你可以拥有蚁群,用0表示。无论如何,你都不能踩到蚁群。
你的目标是砍掉所有的草,使其达到1级,但在切割任何更大的草之前,你必须先抓住最小的草。你从你选择的花园的任何角落开始,只要你不站在蚁群上。 一旦你割草,它就会变成1号,这意味着,你现在可以踩到它,记住,你不能踩到比1号大的草地。
编辑: - 高度是独一无二的 算法应该返回所做的步数(否则为-1),显然步数越少越好,你就不能走出董事会。
示例: 这个矩阵
[1,1,1,0]
[1,0,2,1]
[1,0,3,1]
输出: 3,因为你从右下方的短号开始,然后,你上去,然后离开,(砍草)然后向下(再次砍草)。
建议的解决方案:
正在使用某种泛洪填充算法(在所有方向上递归),并且在任何情况下使用计算的数据结构 - 如最小堆,以保持当前最小的草高,没有预先计算的最小堆我们不能不知道我们是否可以割草。我们从堆中取最小数,然后开始在矩阵中搜索它。我们遇到的每个单元格,我们都会向各个方向寻找我们想要的数字。
这个解决方案显然是最糟糕的,但它解决了这个问题。我只是在徘徊,如果有人可以有一个更好的,我可以想象一些动态编程解决方案可能,不确定。地狱= D
答案 0 :(得分:1)
找到最短路径(具有最小步数)的算法:
使用height > 1
收集所有单元格,然后按高度按递增顺序对其进行排序。 (它们都是独一无二的。)
将起始单元格添加到已排序的单元格集合的开头。
迭代整个集合,找到当前单元格与集合中下一个单元格之间的最短路径,假设所有高度较高的单元格都是蚁群(无法访问)。这可以使用BFS完成。例如:
1 2 4
1 3 0
1 1 1
在第一次迭代中,我们需要使用height = 2
找到右下角和单元格之间的最短路径。我们应该在“虚拟花园”中运行BFS,其中height > 2
的所有单元格都无法通过:
1 2 0
1 0 0
1 1 1
请注意,您无需将较高的单元格更改为零值,只需更改BFS中的条件。
加入所有找到的最短路径。