注意:只是为了抬头,这不是我学校的任务,因为我自己甚至不知道哪所学校写了这个问题。希望没有误会。
我发现这个关于更衣室的有趣问题:
Rec的更衣室有N个储物柜,标有1,2,.... 。 。,N。
每个储物柜都已锁定,但可以使用其唯一的钥匙打开。
每个储物柜钥匙的副本位于相邻的储物柜内;即a 更衣柜钥匙的副本我被放置在储物柜i + 1和i - 1( 锁柜1的钥匙仅在储物柜2中,储物柜N的钥匙仅在 储物柜N - 1)。
T网球位于T个不同的储物柜内(和你一样) 知道他们在哪个储物柜里。你有M的钥匙 储物柜和你的目标是收集所有的网球 打开最少数量的储物柜。
对于图片,您可以直接看到the file here。
我必须向一些新生提出这个问题,但我想先确定我自己已经预先得到了正确的答案。
我在想的是:
需要逐一检查球。因此,对于每个球(忽略其他球),每个球必须通过遍历指定球来访问。对于每个键,计算访问球所需的步骤。最小的结果存储在一个名为“total steps”的变量中。
对下一个球做这个确切的事情,当我得到当前球的最小步数时。我将此值添加到“总步骤”。
如果钥匙上方有一个球,则应用特殊条件,然后按键开始从i + 1和i - 1移动。
我的问题是:我是对的吗?我不想将错误的算法分享给其他人,因为它不专业。期待任何意见,建议和意见。
答案 0 :(得分:16)
您的算法不会产生最少的步数。你不能独立考虑球。让我们考虑以下情况:你只有一把钥匙用于1号储物柜,而球放在储物柜12,10,8,6,4,2中。如果按照我给出的顺序考虑球,最终会得到总步数等于11 + 9 + 7 + 5 + 3 + 1
,而您可以通过11个步骤的单次通过来解决问题。您不应该忽略前面步骤中访问过的框。
答案 1 :(得分:1)
这是一种可以使用的技术:
考虑每个储物柜(其中有一个球,你有一个钥匙,哪个没有)作为图中的一个节点。节点有两种类型:
A) Lockers having balls
B) Lockers of which you have keys.
C) Lockers which have none
考虑将所有类型A的储物柜关闭,将B型打开。
从所有打开的储物柜中,找到所有关闭的储物柜的路径(来自储物柜类型-B),并打开A中最小路径长度的储物柜。此外,打开落入此最小路径的所有C型储物柜,并将它们从C类移至B.
重复上述步骤,直到A中的所有储物柜都打开。您遇到的所有最小路径长度的总和将是您的答案。