两个机器人在一条线上

时间:2014-08-31 21:31:08

标签: algorithm search

当您需要对这两个机器人进行编程以满足时,您可能知道两个机器人掉线的问题。

  

两架机器人从飞机上掉落并使用降落伞降落在一条线上(具有不连续的位置),降落伞留在着陆点。这些机器人都朝北,它们相距不远,一个机器人直接落在另一个机器人的东边。

     

现在要对机器人进行编程,使它们相遇。可以指示他们向左或向右移动到相邻位置并检查当前位置是否存在降落伞。如果遇到另一个机器人,两个机器人都会停在那里,从此过上幸福的生活。

     

降落伞检查可能有条件地执行任意数量的指令,并且可以无条件地重复任何指令块。写下一个机器人可以同时跟随的程序以及他们遇到的哪些服务员。

你必须创建一个适用于两个机器人的通用算法(一点点),以保证机器人能够满足。他们将降落伞留在掉落的地方,他们可以检查当前位置是否有降落伞。

原始声明如下:http://en.wikibooks.org/wiki/Puzzles/Logic_puzzles/Parachuted_Robots 还有一个我不明白的解决方案。如果有人能够理解它,请帮我解释一下。任何其他解决方案将不胜感激。

我对这个问题的第一个想法是编程机器人随机选择首先向右或向左,然后做一个像指数搜索的东西:首先去2个位置到右边,然后4到左边等。如果在一个这次"旅行"在机器人的右侧或左侧找到第二个降落伞(另一个机器人使用的降落伞),机器人只会向那个方向搜索。这有什么意义吗?

非常感谢!

5 个答案:

答案 0 :(得分:21)

我的节目实际上更短,并且也像魅力一样:

start: left
skipNext
goto start
next: left
goto next

这是有效的,因为第二个循环比第一个循环快。

您可以在此处测试您的计划:http://david-peter.de/parachuting-robots/

答案 1 :(得分:11)

您的“初步想法”解决方案也应该有效,但机器人会遇到的时间比the solution you cited at wikibooks要长一些。回顾一下,wikibooks的解决方案是:

  • 10向右走
  • 20左转
  • 30右转
  • 40 If Not Parachute GOTO 10
  • 50右转
  • 60 GOTO 50

如果你不认识语法,作者试图模仿BASIC,其中数字10-60是行号,而GOTO是代码跳转。

第10-40行让两个机器人向右缓慢移动。 “右,左,右”步骤减慢向右移动。它可以很容易地“正确,等待”。第40行检查降落伞。当两个机器人落在线上时,其中一个机器人就在另一个机器人的左侧。左机器人最终将找到另一个降落伞。权利永远不会。当左侧机器人找到合适的机器人的降落伞时,它进入50-60行,在那里它向右移动而没有减速。现在左侧机器人的移动速度比右侧机器人快,左侧最终会赶上。

我个人认为你提出的算法更有趣,因为两个机器人会来回摆动很多。在某种程度上,它是一种类似的算法,但减速随着每一步都呈线性增长。

答案 2 :(得分:2)

在我看来,你的算法应该有效。在发布的解决方案中的想法是,两个机器人保持左右右侧的模式,这意味着它们以一定的速度向前推进。但是当左侧的机器人找到另一个降落伞时,它会以更快的速度向右移动,因为它不会向左移动一次作为其行走模式的一部分,但是会继续向前,最终赶上右边的机器人。

答案 3 :(得分:1)

我做到了:

start: left
       skipNext
       goto start
fastL: left
       left
       goto fastL

这个想法很简单:我们离开了一点。其中一个机器人(右边的机器人)最终会撞到降落伞,然后它将跳出第一个循环,然后进入第二个机器人,这使得他的速度提高了两倍。

答案 4 :(得分:0)

两个机器人向左移动直到右机器人找到左机器人的降落伞并开始向左机器人冲刺。然后他们发生了碰撞。

start: left
       skipNext
       goto start
       goto moveLeftFast

moveLeftFast: left
              goto moveLeftFast