【发布时间】:2020-06-10 14:58:03
【问题描述】:
问题描述:
仓鼠哈米发现了一栋有种子的建筑物。帮他把它们都收集起来。
建筑物排列成一个矩阵的房间,一些房间里有种子。进入大楼后,哈米只会直线奔跑,一路穿过大楼并收集那条线上的所有种子。该建筑有许多入口,哈米可以随意进入任何行或列。
他想用尽可能少的运行来收集建筑物中的所有种子。
这是建筑物的示例布局:
+---+---+---+---+---+
| * | | * | | |
+---+---+---+---+---+
| * | * | | | |
+---+---+---+---+---+
| * | | | | * |
+---+---+---+---+---+
| | | | * | |
+---+---+---+---+---+
| | | | * | |
+---+---+---+---+---+
这栋建筑有 25 房间 (5X5) 但只有 8 rooms 有种子(房间包含“*”)。
我们需要找到收集所有种子的最小运行次数。
我的方法:
我尝试用一些Greedy Approach 解决它,这里是:
1) Start with row/column that contains maximum rooms of seeds (For example: column 1 for here).
2) Updating rows/columns (no of rooms that contain seeds).
3) Repeating steps 1 & 2 until all the seeds are collected.
所以,对于这个例子,当我应用我的方法时,
以Column 1开头(包含3个房间),
更新后,下一个将是Column 4,
这是现在的建筑情况,
+--+---+---+--+---+
| | | * | | |
+--+---+---+--+---+
| | * | | | |
+--+---+---+--+---+
| | | | | * |
+--+---+---+--+---+
| | | | | |
+--+---+---+--+---+
| | | | | |
+--+---+---+--+---+
现在三个房间都包含种子,并且都在不同的rows 或columns,我需要把它们都拿走,结果我用5 runs 完成了,也就是maximum(全部拿走行或所有列始终是完全考虑种子的答案)。无需任何计算,任何人都可以到达这里。包含所有行或列的运行。
但这个问题可以在 4 次运行中解决。
我正在寻找一种方法/算法来找到最小运行次数(我需要运行哪些行和/或列)。
【问题讨论】:
-
问题说,哈米可以直线跑——行/列。
-
有时贪婪的方法不是最好的;这是其中之一。您将不得不编写一个算法来尝试 2 组。
-
也许另一种方法是专注于减少剩余种子的行/列数。通过这样做,它会得到第 4 列(释放两行)、第 1、2 行(每个释放 1 列)和第 3 列(释放 2 列)。我不知道这种方法是否适用于一般情况。
-
而不是贪婪地接受具有大多数种子的行,您的示例最好通过拒绝 来解决>line 与 feest 种子(并采取必要的交叉线)。实际上,在您的示例中,这甚至不涉及任何模棱两可的决定,因为只有一个种子的线永远不会比其交叉线更好。 (但在一般情况下,这也不总是给出最佳解决方案。)
标签: c++ algorithm matrix greedy