有一个正方形的房间,房间的四壁都是镜子。房间里有一个天使和一个恶魔。假设房间是一个单位正方形 [0, 1] × [0, 1] ,那么天使和恶魔便是这个正方形内的两个点 (a, b) 和 (c, d) 。恶魔想要在原地发射致命激光杀死天使(激光可以无限地在镜子间反射)。天使可以根据恶魔的位置,预先在房间里放置一些守卫为自己挡住激光(守卫实际上也是一个个点)。当然,天使可以在自己周围密密麻麻地放一圈守卫,围成一个封闭的圆形,从而让恶魔不管朝什么方向发射激光,最终都无法击中天使。我们的问题是,能把守卫的数量减少到可数个点吗?能把守卫的数量减少到有限个点吗?
这是一个非常经典的问题,我已经见过不止一次了。它可以重新叙述为很多更有趣的实际问题。去年的这个时候,网友 Spark 发来邮件,分享了他在看台球比赛时想到的一个问题:最少需要摆放多少个球,才能挡住白球到目标球的所有可能的路线,迫使对手犯规?如果我们把台球也抽象成一个一个的点,问题就和前面提到的情况一样了。
今天,我终于看到了这个问题的答案,颇为激动,在此和大家分享。
解决这类问题的一个常用技巧便是利用多次翻折把反射路线变为直线。现在,把这个房间不断地翻折,让它平铺整个平面;各种复杂的反射路径,就变成了一条一条的直线段。这样,我们便可认为恶魔的激光并不是在反射,而是径直穿过镜面射入房间的“虚像”。恶魔的目标,便是直接对准某个天使的虚像射击。由于天使的虚像只有可数个,因此天使可以在恶魔周围摆放可数个守卫,一一挡住射向每一个天使虚像的激光(有觉得下图中的网格线弯曲得异常严重吗?那是你的错觉)。
守卫的数量还能进一步减少到有限个点吗?注意到,即使只有有限的守卫,经过翻折之后也将会产生无穷多个守卫的虚像,每一个虚像都可以帮忙挡住激光。因此,只使用有限的守卫是完全有可能的。事实上,不管天使的位置 (a, b) 和恶魔的位置 (c, d) 在哪儿,摆放 16 个守卫总是足够的。下面我们给出一个具体的方案。
容易看出,所有天使虚像的坐标都形如 (2m ± a, 2n ± b) ,其中 m 和 n 都是整数(可以为负)。我们先来考察其中一类虚像,即所有形如 (2m – a, 2n + b) 的点。对于任意确定的 m 和 n ,恶魔 (c, d) 和天使虚像 (2m – a, 2n + b) 的连线都会经过 (m – a/2 + c/2, n + b/2 + d/2) 这个点,因为这个点其实是前两个点的连线的中点。也就是说,在每个格子里的 (- a/2 + c/2, b/2 + d/2) 处都放一个点,就能够挡住所有射向这类虚像的激光了(注意,当 a > c 时,横坐标是负的,因而这些点实际上将位于各个房间的 (1 – a/2 + c/2, b/2 + d/2) 处):
等等,等等,这些黑点都是从哪儿来的?别忘了,我们只能通过翻折建立虚像,不能通过平移建立虚像。因此,事实上,我们需要在初始的房间里对称地放置四个守卫,才能让所有“虚房间”的 (- a/2 + c/2, b/2 + d/2) 处都有一个点:
类似地,天使的虚像坐标还有 (2m + a, 2n + b) 、 (2m + a, 2n – b) 、 (2m – a, 2n – b) 三类,它们又需要另外四组守卫。因此,总共 16 个守卫便能挡住所有可能的激光。
天使的虚像只有可数个? 是這樣麼? 我把問題簡化了一下,惡魔和天使是站在正對著的兩面鏡子之間,根據我的經驗,天使的虛像應該是無數個的。不是麼?
回LS:可数个是“和自然数一样多”,是无限个。 此处我们可以给房间按照螺旋线编号,自然数和房间之间一一对应,也就是房间“和自然数一样多”,即“可数个”。
个人感觉台球和这个还不是很一样,毕竟还有旋转和扎杆跳球等问题。。。最次还有袋口问题呢。。。所以这个是台球简化版~证明很赞!再次想到那个一针穿下去的证明。。。数学现在各种囧啊。。。各种不会算啊。。。被Mathematica包养太久了。。。
那不反射,直接射向天使的那条线呢
@Seter:在(2m + a, 2n + b)那一类里面。
挺巧妙的解法,又是一种思路
看着这些图让我想起了视错觉,方格边线都是弯的~哈哈
呃……文中已经指出了,抱歉没看见。
67你能把这些点合成一个房间贴出来吗?这样能比较直观地看见守卫的分布。
翻折解法……就原理上和初中那个寻找最短桥位置的思路是一样的呢……
不过,前提是激光不会发散……
视错觉+1
非常赞!
另外射向墙角的就可以不考虑或者按照以两条边的任意一条当镜面考虑
视觉错+1+1
觉得推广到3D会比较有意思。
轉載只要注名 來源:matrix67 就可以嗎?!
原来如此,这个证明非常容易理解。
把结论应用回台球比赛的话,用16个球放在16个点挡住所有路线不太现实。实际比赛一般很少用到反弹3次或3次以上的,所以考虑所有在2次反射内能挡住目标球的遮挡点即可,这样的话最少需要多少个?
台球有大小,一个球很难恰好完全遮住目标球,实际上的话还要考虑球的大小和遮挡范围,我觉得用一个目标范围来代替目标点,用线段遮挡来代替点遮挡,只考虑2次反射内所有应该遮挡的范围,这样又是一道新趣题了。
我怎么觉得不用反射,直接点对点发射就能杀死了。。。是我哪里想错了么。。
@Vury Leo
要是说实际情况 因为可以跳球 所以根本不存在可能阻挡白球打中目标球
也就没有讨论的意义了……
很棒的方法!不過檯球會複雜很多,畢竟有旋轉跳球等等~
前段时间到期了。。我进来一看都是广告
@SY`神隐
这16个点内有一个在(a,b)与(c,d)连线上…
不过我在想恶魔自己会挡住一些路径 会不会影响最终结果..
这个证明简单易懂,非常有意思
不是说你昨天遭别个黑了哆嘛,今天斗恢复了呀
贊~好思路,化繁爲簡啊
实际上,这种算法在物理当中,精确来说是在凝聚态物理范畴下的晶体物理学当中就已经存在了,相应的物理概念被称为“周期性边界条件”。在求“最近邻原子”时,这是一个有效的算法。
之前看过一个解法是直接计算路径的中点坐标只有16个位置。
我也想到了晶格。好厉害的解法!
求圆形及正三角形的情况。【】
求空间六面镜子的答案…
天使的虚像只有可数个, 为什么
……泪流满面!!!!!!!!!!!!!
好久没有这么感动了!!!谢谢大神!!!!
斑竹,今天做 google code jam qualification round. 第四题 hall of mirrors 跟这个很像呵呵呵。。
为什么楼主每次都不回呢?
天使的虚像应有无数多个
@lyh
无穷但可数啊
证明简单易懂,非常有意思
拓展到空间的情况呢?