2014-08-31 86 views
8

您可能知道两个机器人在需要编程时遇到问题。两个机器人在一条线上

使用降落伞将两个机器人从飞机上掉落并落在一条线上(离散位置),该降落伞留在着陆点。机器人都面向北方,它们之间距离未知,一个直接落在另一个的东面。

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

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

您必须创建一个适用于两个机器人的通用算法(有点pleonastic),以确保机器人会见。他们把降落伞放在他们掉落的地方,他们可以检查当前位置是否有降落伞。

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

我对这个问题,首先想到的是对机器人进行编程,以选择随机先去左边或右边,然后做出类似指数搜索:先去2个职位,以正确的,那么4到左等。如果在机器人发现第二个降落伞(被另一个机器人使用的降落伞)中的一个“行程”,机器人将只在该方向上搜索。这有意义吗?

非常感谢!

回答

10

您的“第一个想法”解决方案也应该可以工作,但机器人会比the solution you cited at wikibooks需要一段时间。总括来说,在维基解决方法是:

  • 10转到右边
  • 20转到左边
  • 30转到右边
  • 40如果不降落伞GOTO 10
  • 50转到右边
  • 60 GOTO 50

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

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

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

+0

实际上,所提出的算法将无法使用所给出的指令来执行,因为没有办法计算,因此无法进行指数搜索。 – 2015-10-31 07:58:25

+0

同意,OP的指数搜索建议需要计数器。这里提出的线性搜索没有。 – ldgabbay 2015-11-05 16:34:14

2

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

1

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

start: left 
     skipNext 
     goto start 
     goto moveLeftFast 

moveLeftFast: left 
       goto moveLeftFast 
+0

http://stackoverflow.com/a/33393887/1027842 - 这个答案其实是一样的,但是我做的和你做的一样 – Benjamin 2015-11-02 14:15:25

1

我做了这个:

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

的想法很简单:我们向左走一个位。其中一个机器人(右边的那个)最终会撞上降落伞,然后它会跳出第一个回路,然后进入第二个机器人,这使得他离开两倍的速度。