趣题:用最少的点挡住所有可能的反射路径

标签: 趣题 Brain Storm 惊奇数学事实 几何 证明 | 发表时间:2011-12-14 00:20 | 作者:Matrix67 bingo
出处:http://www.matrix67.com/blog

    有一个正方形的房间,房间的四壁都是镜子。房间里有一个天使和一个恶魔。假设房间是一个单位正方形 [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 个守卫便能挡住所有可能的激光。

 
问题来源: http://www.cs.cmu.edu/puzzle/puzzle23.html

相关 [趣题 住所 反射] 推荐:

趣题:用最少的点挡住所有可能的反射路径

- bingo - Matrix67: My Blog
    有一个正方形的房间,房间的四壁都是镜子. 假设房间是一个单位正方形 [0, 1] × [0, 1] ,那么天使和恶魔便是这个正方形内的两个点 (a, b) 和 (c, d). 恶魔想要在原地发射致命激光杀死天使(激光可以无限地在镜子间反射). 天使可以根据恶魔的位置,预先在房间里放置一些守卫为自己挡住激光(守卫实际上也是一个个点).

情景反射陷阱

- 烙饼 - 坏脾气的小肥
情景这个词,很多人称之为场景,都是一个意思. 我喜欢用“情景”,是因为场景的语感更偏重环境描述,而情景则附带有该环境下的直观感受这层意思. 最近一年,我带的几个项目有得有失,大都踩到了同一颗地雷,即“情景反射陷阱”. 这枚生造词的意思是,当用户接触到产品的时候印象尚可,但一旦关闭窗口,就很难想到再回来使用,缺乏刺激用户“再去用那款产品”的条件反射情景.

[翻译]反射的规则

- stern - Some reminiscences, some memories
第一次知道反射的时候还是许多年前在学校里玩 C# 的时候. 那时总是弄不清楚这个复杂的玩意能有什么实际用途……然后发现 Java 有这个,后来发现 PHP 也有了,再后来 Objective-C、Python 什么的也都有……甚至连 Delphi 也有 TRttiContext……反射无处不在. Go 作为一个集大成的现代系统级语言,当然也需要有,必须的.

【反射】教你在十分钟内学会反射

- Xin - 博客园-首页原创精华区
  反射,提供了封装程序集、模块和类型的对象(Type 类型). 可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性. 如果代码中使用了属性,可以利用反射对它们进行访问. 其实反射很简单的,理解了调用的过程再自己动手做几个实例基本上就能熟悉了.   对于反射,我们需要准备好一个类库,编译出DLL文件,然后通过System.Reflection命名空间下的 Assembly类来加载这个程序集:.

【转】java 反射的局限性

- - Java - 编程语言 - ITeye博客
今天公司的JAVA项目碰到一个问题:在生成xls文件的时候,如果数据较多,会出现ArrayIndexOutOfBoundsException. Google发现是项中所用的jxl包(开源库,用以处理xls文件)的一个BUG. 也找到了一个解决办法: http://www.blogjava.net/reeve/archive/2013/01/11/114564.html——即找到它的源代码,修改其中的一个静态常量,然后重新打包成jar即可.

用看不见的玻璃解决屏幕反射问题

- 小天 - Solidot
使用笔记本等电脑,总免不了需要处理屏幕玻璃的反射问题. 然而未来,令人不胜其忧的反光将离我们远去. 日本电气玻璃公司(NEG)在2011年国际平面显示器展上展示了看不见的玻璃面板. NEG所做的只是在玻璃两面覆盖几纳米厚的低反射薄膜层. 典型玻璃片的光反射率是8%,NEG的抗反射技术可以将反射率降低到0.5%.

通过JAVA反射修改JDK1.6*当中DNS缓存内容

- - Taobao QA Team
为了实现性能压测时的域名动态绑定功能,尝试通过java反射修改JDK1.6×当中的DNS缓存,感谢在此过程中林轩同学的大力帮助. 网上也存在着修改DNS缓存的方法,但是都是基于jdk1.5的,无法应用. 另外,大部分都是修改的缓存过期时间,而没有真正去尝试修改dns 的cache内容,所以尝试了很多种方法,并且查看了jdk的源代码,终于实现了修改dns缓存内容和时间,如下,欢迎大家一起探讨.

用看不见的玻璃解决屏幕反射问题

- Deejan - cnBeta.COM
使用笔记本等电脑,总免不了需要处理屏幕玻璃的反射问题. 然而未来,令人不胜其忧的反光将离我们远去. 日本电气玻璃公司(NEG)在2011年国际平面显示器展上展示了看不见的玻璃面板.

Chrome 是怎么过滤反射型 XSS 的呢?

- - 知乎每日精选
首先要说明的是 它是webkit的一个模块,而非chrome,所以Safari和360安全浏览器极速模式等webkit内核的浏览器都有XSS过滤功能. 通过模糊匹配 输入参数(GET query| POST form data| Location fragment ) 与 dom树,如果匹配中的数据中包含跨站脚本则不在输出到上下文DOM树中.另外,匹配的规则跟CSP没有什么关系,最多是有参考,CSP这种规范类的东西更新速度太慢跟不上现实问题的步伐.

一个反射型XSS例子的解析

- - CSDN博客推荐文章
我们在访问一个网页的时候,在URL后面加上参数,服务器根据请求的参数值构造不同的HTML返回. 如http://localhost:8080/prjWebSec/xss/reflectedXSS.jsp?param=value. 上例中的value可能出现在返回的HTML(可能是JS,HTML某元素的内容或者属性)中,.