0

我必须编写一个 java 程序来模拟机器人以将盖子与相应的 jar 匹配。机器人有两只手臂,一只用来装盖子,一只用来装罐子。我无法将盖子与盖子或罐子与罐子进行比较。用户将输入三行:

5(n)
9 7 2 5 6(size of lids)
2 6 5 7 9(size of jars)

输出应该是:

3 5 4 2 1

第 2 行中的第 3 个数字等于第 3 行中的第 1 个数字,依此类推。

我们应该使用分而治之的算法,我真的不知道从哪里开始。我所要做的就是它类似于快速排序。任何帮助将不胜感激。

4

2 回答 2

0

分而治之的算法起初可能会令人困惑。把它想象成你有一些相对较大的问题你无法解决,但如果这个问题非常非常小,你可以找到答案。将其应用于这种情况:假设您没有 2 个大的盖子和罐子尺寸列表,而是有 1 个盖子尺寸和一些罐子尺寸。你可以很容易地告诉我那个盖子适合哪个罐子,对吧?解决 1 个盖子问题的想法本质上是将大问题(几个盖子)分解为一个较小的问题(1 个盖子)。一旦有意义,您就可以继续使用算法。

您可能会使用一些递归来编写您的算法。从基本案例开始,解决最简单的有意义的问题(我喜欢 1 lid 的例子)。一旦你能解决这个问题,你能递归地解决每个盖子的相同问题吗?我没有附加任何代码,因为我不想破坏你的学习体验(这显然是家庭作业)。

于 2013-10-28T22:16:00.167 回答
0

“分而治之”的重点是将工作分成多个较小的问题;然后你解决较小的问题并将它们汇总,直到它们组合成一个解决方案。这几乎意味着递归解决方案。

对于任何递归函数,您总是需要一个“基本案例”。这将是一个很容易解决的简单案例。例如,如果您只有一个罐子和一个盖子,那么您只需返回罐子与盖子匹配即可。(因为作为问题陈述的一部分,每个罐子总是有一个匹配的盖子。)

所以一个开始的地方是一个简单的程序,它只适用于长度为 1 的罐子/盖子列表。然后添加更多的机器使其更有能力。

使用快速排序,您选择一个位置来划分数字(“枢轴”),然后进行非常粗略的排序(只需将应该在枢轴左侧但在右侧的数字移到左侧,反之亦然)。然后在子列表上递归调用快速排序。最终,对快速排序的每个递归调用都会遇到一个基本情况(长度为 1 的子列表);一旦他们都达到了基本情况,快速排序就完成了。(注意:有一些方法可以优化快速排序并通过添加更多代码使其更快,但我在这里谈论的是最简单的快速排序实现。)

也许在这种情况下,您应该从仅包含从 1 到 n 的数字的长度为 n 的列表开始,然后交换数字直到您有正确的列表?

唔。对于长度为 2 的列表,只有两种可能性:列表是否对齐。如果他们排队,你就完成了。如果没有,则交换数字以使它们对齐,然后就完成了。唔。这在某种程度上类似于排序,但不能像排序时那样直接比较数字。(在排序中,你总是知道 3 排序低于 5,但在这里可能不是这样。)所以,现在考虑一种方法来分解列表并继续这样做,直到你有一个长度为 2 或长度为 1 的子列表,然后处理那些琐碎的案件。

听起来是个有趣的问题。我希望你喜欢它的工作。

于 2013-10-28T22:28:46.923 回答