我的朋友和我分享了这个编码拼图,我被困住了。这就是谜题:
想象一下洞穴和小偷的阵列,洞穴由其代表 数组索引。每天,小偷都可以移动一个洞穴 方向,可以回到以前访问过的洞穴,但他必须做 移动并且不允许环绕。
您将获得一个要检查的洞穴列表,每天一个按时间顺序排列 订购。返回这些动作是否保证你会抓住 小偷至少在你的一张支票上。
我提出了什么:
假设洞穴阵列为0索引。然后,您可以定义" boundary" 作为索引1和len(洞穴)的点数 - 2.只要你从a开始 边界点,线性扫描到下一个边界点,重新检查a 在你到达之后的第二天边界点,然后扫过 回到另一个边界点,你可以保证赶上 贼。例如,如果我们的洞穴长度为5:
123321和123123都可以保证小偷被抓住。
但是,我不认为这是一个详尽的模板,可能有不同的方案仍然有效。我想知道是否有人有任何其他想法!
答案 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])
这意味着,小偷不能在任何洞穴中,假设他没有被抓住。