二维阵列扫描算法

时间:2017-08-10 11:21:40

标签: algorithm performance sorting math

我有一个扫描二维阵列的问题,阵列代表一个花园,只有当草被砍伐而不是太高时,你才能踩到花园的草地上。由数字1代表的割草。高草代表数字大于1,数字越大 - 草越高,高度独特。在这个花园里,你可以拥有蚁群,用0表示。无论如何,你都不能踩到蚁群。

你的目标是砍掉所有的草,使其达到1级,但在切割任何更大的草之前,你必须先抓住最小的草。你从你选择的花园的任何角落开始,只要你不站在蚁群上。 一旦你割草,它就会变成1号,这意味着,你现在可以踩到它,记住,你不能踩到比1号大的草地。

编辑: - 高度是独一无二的 算法应该返回所做的步数(否则为-1),显然步数越少越好,你就不能走出董事会。

示例: 这个矩阵

 [1,1,1,0] 
 [1,0,2,1]
 [1,0,3,1]

输出: 3,因为你从右下方的短号开始,然后,你上去,然后离开,(砍草)然后向下(再次砍草)。

建议的解决方案:

正在使用某种泛洪填充算法(在所有方向上递归),并且在任何情况下使用计算的数据结构 - 如最小堆,以保持当前最小的草高,没有预先计算的最小堆我们不能不知道我们是否可以割草。我们从堆中取最小数,然后开始在矩阵中搜索它。我们遇到的每个单元格,我们都会向各个方向寻找我们想要的数字。

这个解决方案显然是最糟糕的,但它解决了这个问题。我只是在徘徊,如果有人可以有一个更好的,我可以想象一些动态编程解决方案可能,不确定。地狱= D

1 个答案:

答案 0 :(得分:1)

找到最短路径(具有最小步数)的算法:

  1. 使用height > 1收集所有单元格,然后按高度按递增顺序对其进行排序。 (它们都是独一无二的。)

  2. 将起始单元格添加到已排序的单元格集合的开头。

  3. 迭代整个集合,找到当前单元格与集合中下一个单元格之间的最短路径,假设所有高度较高的单元格都是蚁群(无法访问)。这可以使用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中的条件。

  4. 加入所有找到的最短路径。