洞穴中的小偷编码拼图

时间:2017-09-29 15:12:40

标签: algorithm puzzle

我的朋友和我分享了这个编码拼图,我被困住了。这就是谜题:

  

想象一下洞穴和小偷的阵列,洞穴由其代表   数组索引。每天,小偷都可以移动一个洞穴   方向,可以回到以前访问过的洞穴,但他必须做   移动并且不允许环绕。

     

您将获得一个要检查的洞穴列表,每天一个按时间顺序排列   订购。返回这些动作是否保证你会抓住   小偷至少在你的一张支票上。

我提出了什么:

  

假设洞穴阵列为0索引。然后,您可以定义" boundary"   作为索引1和len(洞穴)的点数 - 2.只要你从a开始   边界点,线性扫描到下一个边界点,重新检查a   在你到达之后的第二天边界点,然后扫过   回到另一个边界点,你可以保证赶上   贼。例如,如果我们的洞穴长度为5:

     

123321和123123都可以保证小偷被抓住。

但是,我不认为这是一个详尽的模板,可能有不同的方案仍然有效。我想知道是否有人有任何其他想法!

1 个答案:

答案 0 :(得分:1)

解决这个问题的一种方法是为每个步骤i定义一个可行位置数组,以便小偷不被捕获,如下所示:

Stop clauses and boundaries:
thief[-1][i] = true (for all i in [0,NUM_CAVES))
thief[k][-1] = false (for all k)
thief[k][NUM_CAVES] = false (for all k)
Step:
thief[k][i] = check[k] != i && (thief[k-1][i-1] || thief[k-1][i+1])

<强>直觉:
在步骤k,小偷不能(没有被抓住)在被搜查的洞穴中(这是check[k] != i部分)。
另外,他不能进入洞穴i,如果他不可能在前一轮的任何相邻洞穴(这是第二部分,thief[k-1][i-1] || thief[k-1][i+1])。

这可以在O(n*m)时间内Dynamic Programming解决,其中n是洞穴数量,m是提供列表的长度。

完成计算表后,答案基本上是:

NOT(thief[m][0] || thief[m][1] || ... || thief[m][n-1])

这意味着,小偷不能在任何洞穴中,假设他没有被抓住。