uyhip 趣题 拉灯问题总有解吗?

这是一个让我纠结许久,又不甘放弃的puzzle。在一个意志力极度薄弱的下午,对不起,我看了答案...所以,这又是一篇马后炮文章。但不是所有马后炮都一文不值。如果在讲解一个解答的时候,我们不能把思考背后的动机讲清楚,于他人和自己的价值就会小很多。每一步推理的过程,每一个构造的细节,不是无迹可寻的。我希望去揭示背后的东西。

一个解答背后包含了大量的探索。解谜高手对于如何避免无效的思考,摸清靠谱的思路,总是有一套自己的办法。遗憾的是,好些同学由于各种原因,没有公开自己的方法。例如,高斯同学,他认为数学家应该隐藏研究背后的脚手架,呈现给读者的是完整的建筑。

波利亚的《How to Solve It--A New Aspect of Mathematical Method》(中文译名《怎样解题--数学思维的新方法》)把思考的过程称为探索法。在解答问题的过程中,灵光一线的瞬间非常奇妙,多少人苦恼于它的时隐时现。又或者,我看到了一个解答。是的,它是正确的,真是巧妙啊。问题是,这是怎么想到的呢?

其实,这些貌似天外飞仙的奇思妙解也是有理可依,有迹可循。波利亚在这本造福人类的书中,对思考的方法做了很好的总结。(陶哲轩15岁时也写过一本《Solving mathematical Problems》)。也就是说,只要我们运用正确的思考方法,不畏险阻,热爱挑战,不断积累思考,终有一天,能够达到我们希望的境界。

回到正题,这个问题来自于Using your Head is Permitted网站。我是从matrix67的博客看到的。

题目摘自matrix67:

“某公司有 n 间办公室。每间办公室都有一盏灯,拉动它的开关即可改变电灯的状态。某些办公室之间存在“业务相关

的关系(这是一个对称的关系)。一个办公室可以和 0 到任意多个办公室相关。愚人节那天,有人在大家上班之前偷

偷对办公室的电灯开关做了手脚:拉动任何一个办公室的电灯开关,都会同时改变该办公室以及所有相关办公室的电

灯状态。初始时,所有灯都是关着的。证明:等到大家来上班后,总能用有限次的开关,最终把所有办公室的灯都打

开。”

解答在以上两个链接当中都有

说说我的思路:

如果把这个问题抽象出来就是一个对称的0、1矩阵,对角线都是1。

选择一些行向量相加,使得结果当中每个数字都为奇数。

例如

1 0 1

0 1 1

1 1 1

选择[1 1 1]

1 0 0

0 1 0

0 0 1

选择[1 0 0] [0 1 0] [0 0 1]

随便取几个较小的n,试验一下,都是成立的。找不到反例,看起来这个结论是对的,但是并不明显。

把条件特殊化。n=1,2,3,都是对的。

从特殊情形推广到一般情形,各位想到了什么呢?

数学归纳法

相信看到这里,很多独立思考的同学都想到了数学归纳法。接下来怎么办呢?

例如从n=3推广到4

1 0 1
0

0 1 1
0

1 1 1
1

0 0 1 1

首先想到的是,如果增加了新列以后,原先选择的向量相应的位置有奇数个1。那么就可以继续选择原先的向量。

原先选择[1 1 1],扩展以后,第4列是1。依然选择[1 1 1 1],所选的向量向加都是奇数,那么问题容易得解。

但是,新的位置在原先的位置有偶数个1怎么办呢?

例如

1 0 0 1

0 1 0 0

0 0 1 1

1 0 1 1

原先选择[1 0 0][0 1 0] [0 0 1],新的向量就是[1 0 0 1] [0 1 0 0] [0 0 1 1],第4列有偶数个1,显然是不对的。

当时的我就是卡在了这个地方。没有更好的思路。

这时候应该怎么办?翻一翻《How to Solve It》,看看有什么好的建议。

镇定一下情绪。

我们是否不该盲目地进行试探,而是要仔细地回顾这个问题,列举一下已知量、条件、结论。思考从什么地方下手,然后制定一个解题策略。(波利亚的思考法则)

结论是什么?存在一种选择方式,使得所选向量中每列的1为奇数个。所有的选择方式有2^n种,所以可能的结果也有那么多。这是一个存在性的结论,因此我们似乎无法从结论入手去逆推过程。

已知量是什么?

对于n=1, 2, 3, ..., n-2, n-1向量,结论都成立

1 0 0 1

0 1 0 0

0 0 1 1

1 0 1 1

而且n=4, n-1=3的对称矩阵不是只有(去掉红色部分)

1 0 0 1

0 1 0 0

0 0 1 1

1 0 1 1

还有

1 0 0 1

0 1 0 0

0 0 1 1

1 0 1 1   如果我们把第2列看作新加入的一列的话

因此n-1 = 3的子对称矩阵(sub sym matrix)实际上有4个。而且这4个矩阵,都符合上面的困境,否则的话只要有一个子矩阵不满足困境,结论即可证明。

而且我们知道这4个矩阵,可以组合成[单 单 单 双] [单 单 双 单] [单 双 单 单] [双 单 单 单]的向量

例如

1 0 0 1

0 1 0 0

0 0 1 1

1 0 1 1  选择1,2, 3向量可以得到新的[1 1 1 2]向量

1 0 0 1

0 1 0 0

0 0 1 1

1 0 1 1  选择4向量得到新的[1 0 1 1]

哈,看到这里,是否有了一些思路了呢?因为我们的已知量增加了,而且这些新的的东西都有很好的特征:

这些新的向量等价于[1 1 ... 0] [1 1 ... 0 1] ...[0 1 ... 1],即n个无重复的向量,其中一列是0,其他都是1。

然后很自然地想到组合这些向量。

如果n=2,4,6,8..., 直接把这些向量相加,就可以得到等价于[1 1 ... 1]。这不就是我们的结论吗。

看来n是偶数的情形,我们已经有了一种构造性的方法,来证明我们的结论了。

如果能搞到这一步,之前一筹莫展的心情已经一扫而空,相信各位都能体会到满满的信心了。有前途啊!

下面就是设法搞定n是奇数的情形了。

一般性问题不好想的时候,从特殊情形考虑。(波利亚的思考法则)

考虑n=5 [1 1 1 1 0] [1 1 1 0 1][ [1 1 0 1 1] [1 0 1 1 1] [0 1 1 1 1]

如果选择偶数个向量,原先全是1的位置变成了0,原先是有0的位置变成了1。例如选[1 1 1 1 0] [1 1 1 0 1],形成[0 0 0 1 1]

如果选奇数个,原先全是1的位置还是1,原先有0的位置变成了0。例如选[1 1 1 1 0] [1 1 1 0 1][
[1 1 0 1 1],得到[1 1 0 0 0]

然后对比下,发现都有奇数个0,偶数个1。

猜想1,无论我们如何组合新的向量,得到的都是奇数个0,偶数个1

例如选[1 1 1 0 1]+[1 0 1 1 1]=[0 1 0 1 0],再试验一下,也是这样。这个猜想的可信度已经比较高了。而且,这个结论是比较容易证明的

于是我们通过组合新的向量,我们又获得了新的向量在n为奇数的情形下,更一般性的结论。

真的是越来越有希望了!

新的向量好像已经被挖掘到极限了,老的向量是否还有开发的空间呢?

如果我们在n为奇数的对称矩阵中,能找到一个向量,它有奇数个1,偶数个0,就能和新的向量形成互补了

例如

1 0 1 0 1

0 1 1 0 0

1 1 1 0 1

0 0 0 1 1

1 0 1 1 1  中第1行就是这样的向量。

好的,能否证明这个

猜想2,在n为奇数的对称矩阵中,能找到一个向量,它有奇数个1,偶数个0

这个结论也是比较容易证明的,运用反证法。如果我们不能很好地从正面证实它,就尝试从反面找到矛盾。(波利亚的思考法则)

首先,由于矩阵的对称性,他的对角线两边加起来有偶数个1,它的对角线有n个1,所以总共有奇数个1。

如果所有地向量都有偶数个1,那么1的个数加起来就是偶数,与已知矛盾。

证明了猜想2,那么整个命题得到证明。

OK,I can die in peace。至少,在今晚。

uyhip 趣题 拉灯问题总有解吗?

时间: 2024-08-06 00:40:03

uyhip 趣题 拉灯问题总有解吗?的相关文章

智力趣题几则

古时一位农民被人诬陷,农民据理力争,县官因已经接受别人的贿赂,不肯放人,又找不到理由,就出了个坏主意.叫人拿来十张纸条,对农民说:“这里有十张纸条,其中有九张写的‘死’, 一张写的‘生’,你摸一张,如果是‘生’,立即放你回去,如果是‘死’,就怪你命不好,怨不得别人.”聪明的农民早已猜到纸条上写的都是“死”,无论抓哪一张都一样.于是他想了个巧妙的办法,结果死里逃生了.你知道他想的什么办法吗? 把其中的一张纸条吃下去,再根据排除法,结果就有九张死那么它吃下去的就是“生” 称苹果         有十

JZYZOJ 1385 拉灯游戏 状态压缩 搜索

http://172.20.6.3/Problem_Show.asp?id=1385 刚开始想的时候一直以为同一排不同的拉灯顺序对结果是有影响的,手推了好多遍才发现拉灯结果只和拉的灯有关,这也要打表,可以说非常智障了. 如果从上向下寻找拉的灯,那么每一排全暗主要相关的是下一排(通过下一排补齐)和初始状态,而每一排的初始状态是和其本身和上一排有关的,那么只要找出第一排所有的拉灯方案(2^5种)然后对这几种方案模拟一遍找能全亮且步数最小的方案. 锻炼搜索能力的好题 注意小于6步-交的时候没看见,日常

拉灯游戏 搜索

你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态. 我们用数字“1”表示一盏开着的灯,用数字“0”表示关着的灯.下面这种状态 1011101101101111000011011 在改变了最左上角的灯的状态后将变成: 0111111101101111000011011 再改变它正中间的灯后状态将变成: 01111110011100

水题 开灯问题

开灯问题时间限制:3000 ms  |  内存限制:65535 KB难度:1 描述    有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推.一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号.k≤n≤1000 输入    输入一组数据:n和k输出    输出开着的灯编号样例输入 7 3 样例输出 1 5 6 7 #include<iost

序列相关的趣题 之四

(8) 给定一个英文单词,消除其中重复的字母,只能删掉字母,不能交换字母顺序,最后原单词中每个字母只出现一次,求字典序最小的结果. 这是toj一个题,百度面试也问过,原题见 http://acm.tju.edu.cn/toj/showp3257.html 此题我非常喜欢,巧妙之处是其算法是O(n)的-- .我们一个字母一个字母加入序列,一旦来了一个比较"小"的字母,因为我们需要字典顺序最小,我们希望它尽可能靠前.所以我们试图"冒泡"似的把小的往前面送,经过尾部那些较

序列相关的趣题 之二

(4)数组中找到两个数和的绝对值最小 像不像2-SUM? 不多解释,主要是绝对值大的动就行,两头扫的方法真好!当然要先排序,出去排序就是O(n),算上排序的话退化到O(nlogn) 这也是codility上的问题,还没来得及整理. 上个代码: // you can also use includes, for example: // #include <algorithm> #include <algorithm> int ab(int x) { return (x >= 0

趣题[0]

趣题[0] 来源 17级老学长的作业题 题面 \(n\) 个物品,有两种值\(a[i]\)和\(b[i]\),给定\(k\).从中选出一些物品,使得 \(\sum{a[i]} = k * \sum{b[i]}\),并且 \(\sum{a[i]}\) 尽量大,求满足条件的最大的 \(\sum{a[i]}\). \(1 <= n.a[i].b[i] <= 100\) \(1 <= k <= 10\) 题解 做差值之后分正负做背包,然后扫一遍即可. 复杂度 \(O(100 * k * n

趣题[1]

趣题[1] 来源 http://www.csie.ntnu.edu.tw/~u91029/Sequence3.html UVA - 12192 介绍 引入 \(n*m\)的矩阵,每行从左到右递增,每列从上到下递增,在矩阵中找数\(x\)出现过的位置. 具体做法可以在这个链接ctrl+F[Search in Sorted Matrix: Saddleback Search],复杂度\(O(n+m)\) 想法 现在我们知道了,从这样的矩阵的右上角走下来可以把矩阵分成两个部分,左上部分小于\(x\),

算法趣题之回文数

题目:求用十进制.二进制.八进制表示都是回文数的所有数字中,大于十进制数10的最小值. 啥叫回文数:如果把某个十进制数按相反的顺序排列,得到的数和原来的数相同,则这个数就是"回文数".例如12321就是一个回文数. 这个题目拿Ruby.JavaScript.python.Java都很容易实现,因为这些语言都提供了字符串逆序处理的接口,或者相关其他接口,而C语言没有提供直接转换的接口,所以下面用C语言解题,其中设计的封装在工作中也会经常碰到,故记录并分享,如有错误或者有更好的算法,欢迎留