【问题标题】:Algorithm to find the minimum number of shots required to erase dots in a grid [closed]找到擦除网格中的点所需的最小拍摄次数的算法[关闭]
【发布时间】:2013-10-09 06:17:08
【问题描述】:

我在一个网站上看到了这个编程难题,并试图解决它。

问题

给你一个 N x N 网格,其中有一些随机分布的点。你必须使用以下允许的操作删除这些点

  • 您可以一次删除一行中的所有点

  • 或者您可以一次删除一列中的所有点。

您必须找到消除所有点所需的最少拍摄次数。

例子

在下面的网格中,您需要三张照片 - 一张水平照片和两张垂直照片来去除点。

我尝试了一种方法来计算带有点的行和列,并且以最小值为准。但在特定情况下它会失败,例如上面的示例。 有什么方法可以解决这个问题,或者有什么类似的情况可以参考解决这个问题?

编辑

给定的约束是

1 <= N <= 1000
0 <= x,y <= 10^9
Time Limit: 2 sec

其中 n 是网格的维度(即 nxn),x,y 是坐标

【问题讨论】:

  • 我想,每列投掷每一个镜头是我能得到的最佳解决方案。在最坏的情况下,它是 O(N),对于任何其他解决方案,最坏的情况是所有点都对角排列或完整的矩阵被点填充
  • @Reddy :但是如果你为每一列投一枪,那么对于上面给出的例子,它会给出错误的答案为 6。虽然正确的答案是 3
  • @Insane Coder,抱歉我错过了问题
  • 运行 CodeChef 挑战 "Kamehameha" 的完全相同的副本。

标签: java algorithm graph-algorithm


【解决方案1】:

将二维网格转换为二分图。左侧包含节点表示行,右侧包含节点表示列。对于每个包含点的单元格,假设它的坐标是(x,y),添加一条连接row_x和column_y的边。二分图建立后,使用匈牙利算法得到最大匹配。由于在二分图中,最大匹配的答案等于最小顶点覆盖,这正是您想要的。

匈牙利算法是一种 O(V*E) 算法。更多详情请参考Hungarian algorithm

更多关于二分图的信息,请参考Bipartite graph,你可以在这里找到为什么最大匹配等于最小顶点覆盖。

【讨论】:

    【解决方案2】:

    我会尝试一个详尽的算法。如果你做得对,它并不像听起来那么糟糕。

    您已经知道,在最坏的情况下,它会拍摄 N 次(如果您在每一行或每一列拍摄,它肯定会工作)。

    因此,要改善最坏的情况,您只需尝试所有可能的列镜头 + 行镜头的排列,其中镜头的总数小于 N。例如,如果 N=4,则必须有非平凡的解决方案为

    (0,3)
    (1,2)
    (2,1)
    (3,0)
    

    对于您想要拍摄照片的任何轴(列或行),都有(s choose N) 的可能性。因此,大 N 的可能性总数类似于(N/2) choose N,无论如何对于 N

    我确信有更好的启发式算法,也可能有更好的更坏情况算法。

    【讨论】:

    • 但是输入域的大小可以达到 1000 x 1000,因此需要更优化的解决方案。
    • 然后我会非常仔细地查看大小N 的解决方案如何应用于大小N + 1 的解决方案。理想情况下,您可以重用大部分状态并显着降低计算的复杂性。
    • @Evgeny Shavlyugin 得到了问题。
    【解决方案3】:

    我认为递归可能应用在这里。我认为它效率不高,但以下是您可以使用的想法。

    从最左边的点开始。你有以下场景:

    1. 在同一行同一列中有另一个点。 -> 分支出三种可能性

    2. 在同一行但不在同一列中有另一个点。 -> 拍摄这一行,删除同一行中的所有点并移动到下一个点。

    3. 在同一列但不在同一行中有另一个点。-> 拍摄此列,删除同一列中的所有点并移动到下一个点。

    4. 在同一列或同一行中没有点。 -> 拍摄行或列,没关系,继续下一个点。

    对于第一种情况,分支必须执行如下操作:

    int minimumNumberOfLines( matrixOfDots ) {
      return min( 1 + minimumNumberOfLines( with row shot ),1 + minimumNumberOfLines( with col shot ), 2 + minimumNumberOfLines( with row and column shot ) ). 
    }
    

    【讨论】:

    • 如果所有网格都包含点,则会导致超出时间限制。大约是 O(3^n),这肯定是不可接受的。
    猜你喜欢
    • 2016-08-10
    • 2014-06-11
    • 1970-01-01
    • 2013-03-28
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    相关资源
    最近更新 更多