更衣室算法

时间:2016-01-19 00:32:04

标签: algorithm

注意:只是为了抬头,这不是我学校的任务,因为我自己甚至不知道哪所学校写了这个问题。希望没有误会。

我发现这个关于更衣室的有趣问题:

  

Rec的更衣室有N个储物柜,标有1,2,.... 。 。,N。

     

每个储物柜都已锁定,但可以使用其唯一的钥匙打开。

     

每个储物柜钥匙的副本位于相邻的储物柜内;即a   更衣柜钥匙的副本我被放置在储物柜i + 1和i - 1(   锁柜1的钥匙仅在储物柜2中,储物柜N的钥匙仅在   储物柜N - 1)。

     

T网球位于T个不同的储物柜内(和你一样)   知道他们在哪个储物柜里。你有M的钥匙   储物柜和你的目标是收集所有的网球   打开最少数量的储物柜。

对于图片,您可以直接看到the file here

我必须向一些新生提出这个问题,但我想先确定我自己已经预先得到了正确的答案。

我在想的是:

  1. 需要逐一检查球。因此,对于每个球(忽略其他球),每个球必须通过遍历指定球来访问。对于每个键,计算访问球所需的步骤。最小的结果存储在一个名为“total steps”的变量中。

  2. 对下一个球做这个确切的事情,当我得到当前球的最小步数时。我将此值添加到“总步骤”。

  3. 如果钥匙上方有一个球,则应用特殊条件,然后按键开始从i + 1和i - 1移动。

  4. 我的问题是:我是对的吗?我不想将错误的算法分享给其他人,因为它不专业。期待任何意见,建议和意见。

2 个答案:

答案 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中的所有储物柜都打开。您遇到的所有最小路径长度的总和将是您的答案。