目录
〇,最强大脑同款游戏
有个APP叫我是最强大脑,里面实现了很多最强大脑第五季及以后的项目。
有些项目只在苹果市场中有,但是苹果的打包APP下载不了了,只能单个下载了。
还有个微信小程序“麦麦鱼”也可以找到一些项目:
《第1-4季》
一,盲填数独
这是最强大脑第一个模板题。
首先我们看到,填数字和填颜色的数学本质是一样的,只不过颜色的记忆可能难一丢丢。
那么整个问题分解成2个相同的子问题,所以我们只需要分析:
给定一个数字,填完其他80个数字,使之成为数独。
解密:
首先我们准备任意一个数独,为了方便记忆可以选一个最简单的:
这个数独是有多简单,我就不赘述了。
然后嘉宾选定一个数字,比如选第6行第1列的数字是7,而我当前第6行第1列的数字是8,那我只需要把所有的7换成8,所有的8换成7,就OK了。
简单的一塌糊涂,这是我第一个想公开解密的项目,但是看网上说孙彻然是世界数独顶级选手,我怂了。
二,盲指过天桥
这个也不难的样子,只有把绿色的挑出来,做个差分,就只需要记一个长度不到50的序列,每个都是1,2,3,4中的一个。
而且规则没有要求把所有绿色格子都报出来,只要报出来的都是绿色的即可,那对于挨的近的可以跳过一个,所以实际上记忆40个左右就够了。
三,盲填折线数独
首先我们公知,要17个数字才能确定整个数独,那么只有9个数字显然是不能确定的。
熟悉搜索算法的人应该很容易想到,这显然有很多解,所以就有可能其实很简单。
我随便试了一下,按照相同的折线及其9个数字,随意把整个数独填满:
然后校验一下,发现第7列和第9列不对,其他的列、所有的行、所有的宫都是对的。
(因为我大趋势是从左往右填的,而且最后填右边三个宫是根据行推的,所以只有右边的列不对是很正常的)
然后基于此,把上面的38互换,下面的39互换,就完成了。
四,盲填骑士跳
首先骑士跳就是2个无关的问题组合起来的,一个是数字计算,一个是跳着填。
数字计算这部分明明非常简单,还故弄玄虚,我来给一个简单的:
现在每行每列都是400,还需要77,只需要把对角线换掉即可:
这有何难?
如果要求所有数字都不同,那么会稍微麻烦一点点,但是方法还是类似的。
最强大脑里面这个,显然并不要求所有数字都不同,因为34就重了。
跳着填也不难,这就是马的哈密顿链,参考马的哈密顿图
五,七阶幻立方
首先,虽然有343个格子,但是考虑对称性,实际上不同位置的格子位置只有1+3+6+10=20种,也就是说最笨的方法是把20种情况都背下来就完了。
实际上,利用幻方的规律,记忆量一定会小的多,甚至有可能不需要记忆。我只研究过幻方,还没研究到幻立方,所以不太确定。
六,泰森多边形
看最强大脑的规则介绍,首先疑问就是剖分的唯一性,于是我研究了一下:平面剖分
同时也确定了一个想法是对的,根本不需要去算泰森多边形,要看哪2个泰森多边形相同,只需要看哪个点周围的点构成的多边形是相同的即可。
也就是说,最强大脑里面的项目其实不是在脑海里面算泰森多边形,还是算Delaunay三角剖分,而这个剖分恰恰是所有三角剖分里面最符合直觉的,所以难度比计算泰森多边形低太多太多。
七,分形
这是分形中的Julia集。
代码画出来的2个图:
八,数独王中王(拼图)
首先看下规则:
把2个横条、2个竖条、4个方格拼起来,再完成数独,一共是4行4列12宫。
主要难点在于怎么拼,拼好之后解答非常容易。
再看看比赛的题目:
我们给盘面编号:
首先,两个竖条的高度一定是相差2,所以可能的位置只有4个:2、3、7、9(以竖条中上面那个格子所在编号描述)。
其次,左边竖条的上面格子和两个横条的四个格子都不在同一行或者同一列,所以只有5种情况,左右2个竖条的位置分别是2/7、7/2、3/7、7/3、3/9。
再然后,要保证2个横条的左边格子不在同一列。所以只有2种情况,左右2个竖条的位置分别是7/3、3/9。
最后,右边竖条的下面格子不能和2个横条在同一行,所以只剩1种情况,左右2个竖条的位置分别是3/9,左右2个横条的位置分别是4/7
所以能确定的就是:
接下来分析4个单格的位置,很容易确定,左下的格子一定是放12,左上的格子一定是放2,右上的格子在1,右下的格子是10
至此,所有位置都确定了。
剩下的也非常容易:
《第5-8季》
一,数字华容道
二,层叠消融
三,拓扑折纸
一种折出AB
另一种折出CD
展开的两面:
四,立体一笔画
立体一笔画可以直接转换成普通一笔画问题。
五,数字迷阵
就是数图
六,彩色数图
七,阿基米德十四巧板
八,火线对决
九,谜走点线
十,阿基米德半正多面体
十一,方块识途
十二,重力四子棋
3D四子棋 的5*5*5版本。
十三,康斯逆推
十四,幻圆
十五,四色定理
十六,空间密径
空间密径的铺格子,和穿插纸条是非常相似的。
差别只在于穿插纸条的线条之间是可以交叠的。
十七,异形谜盘
十八,旋转拼图
十九,斐波那契螺旋树
这个名字太扯了吧!
我在作者本人的个人网站中找到了这个东西:John Edmark
斐波那契螺旋树这个名字完全是节目组自创的。
HELICONE的最大角度是黄金分割角的一半,这和斐波那契有啥关系。
硬是要联系起来的话,只能说斐波那契螺线是黄金螺线的近似螺线,参考这里
但是好像还是没有很直接的联系,还不如叫黄金螺旋树呢。
二十,摸黑校位
记忆之后盲复原(纯色块拼图——轮换),不过其实每一关有3次提交机会,即2次中途查看机会。
我玩的同款项目4*4,每查看一次罚时20秒,我的记录:
二十一,圆形之美
在大量的左图中找到能包含右边目标图形的一个。
既然不限制圆形的数量,也不限制一个圆在布尔表达式中只能出现一次,而且内部区域完全被圆形覆盖,那么就和布尔运算无关了,因为任何一个区域都可以用布尔运算表达出来。
所以这就是直接找到这个轮廓就完了,和布尔运算一点关系都没有。。。
二十二,立方骑士
二十三,黑白迭代
二十四,三人游
二十五,黑白无双
二十六,六色谜盘
二十七,黄豆计划
二十八,千丝万缕
二十九,锁定高地
三十,多米诺效应
三十一,勇往直前
三十二,智行营救
三十三,联动归位
三十四,欧拉幻方
欧拉幻方其实就是正交拉丁方
三十五,玲珑拼图
三十六,C60迷阵
三十七,詹森多面体
三十八,峰回路转
三十九,光点数图
根据光点闪烁的长短数据,解析成数字。
一共有0-9这10个数字,二进制需要4位表示,即0000 0001...1001
0对应短,1对应长,中间还需要间隔。
用0表示熄灭,1表示亮,则1代表短,111代表长,0代表间隔。
所以0-9分别用13个状态表示就是
1010101000000
1010101110000
1010111010000
1010111011100
1011101010000
1011101011100
1011101110100
1011101110111
1110101010000
1110101011100
只需要关注偶数次序的状态即可,即从1-13列取出第2 4 6 8 10 12列:
000000
000100
001000
001010
010000
010010
010100
010101
100000
100010
这就是观察0-9的最终状态。
我第一次玩,解析数字是7110957281778830
四十,提笔乾坤
四十一,竞数连环
四十二,六面来风
A项目策略:
B的4*4*4的立方体,是从A的8*8*8的立方体下采样得到的,所以A的每2*2*2=8个相邻格子中最多只有1个位置是对的,并不需要搜索所有的格子。
B项目:
四十三,公约数列
四十四,蝴蝶效应
四十五,珍珑棋局
四十六,逻辑电路
四十七,管道迷阵
四十八,一触即发
《第9-11季》
一,运Q帷幄
二,六宫数局
三,双面拼图
双面拼图是从两边往上按的,和6*6*2的立体的拼接方式还是有区别的。
准确来说,有2个区别:
(1)双面拼图是扁平型的,1*1*2(两层)和1*2*1(一层)是完全不一样的,也就是说分层是很明确的。
(2)如果有两层,那么一定有一层能盖住另外一层。
四,康斯迭代
康斯迭代是六边形康斯逆推和六边形黑白迭代的组合,2个问题是独立的。
最强大脑中的这个项目,有一个很隐晦的后门,我来揭开这个秘密。
首先注意到,出现的六边形康斯逆推都是对称局面(所给数字对称),所以我们也只讨论对称局面。
推测一:对称的六边形康斯逆推不一定只有对称解(所填格子对称),甚至不一定有对称解,但对于节目中出现的,都有对称解。
推测二:六边形康斯逆推可能有多解,也可能有多个对称解,但对于节目中出现的,对于它的任意对称解,都能找到六边形黑白迭代的解。
推测三:对于六边形黑白迭代,即使是对称局面,也不一定有对称解,但对于节目中出现的,任意六边形康斯逆推对称解作为输入局面,都有六边形黑白迭代的对称解。
五,希尔伯特旋涡
图片扭曲旋转的方式,是按照每个点离中心的距离,距离越近旋转角度越高,成线性关系。
int main()
{
Mat img = imread("D:/1.png");
Mat img2 = img.clone();
int r = img.rows / 2, c = img.cols / 2;
for (int i = 0; i < img.rows; i++) {
for (int j = 0; j < img.cols; j++) {
double len = sqrt((i - r) * (i - r) + (j - c) * (j - c));
if ( len > 200)continue;
double t = 3.14 * (200 - len) / 200 * 6.5;
int x = i - r, y = j - c;
int x2 = x * cos(t) - y * sin(t) + r, y2 = x * sin(t) + y * cos(t) + c;
img2.at<Vec3b>(i, j) = img.at<Vec3b>(x2, y2);
}
}
imshow("img2", img2);
cv::waitKey(0);
return 0;
}
其中6.5是根据截图调整出来的值。
六,移星掠形
七,明灯谜局
八,战旗阵地
九,时间旅人
十,蜂窝谜巢
示例是非常简单的,直接按顺序一个个推就可以了。
每一步最多只有2个未知格子,比如11到14,其中11和14已经确定位置,需要推导12和13的位置,在一条线上枚举12可能的几个位置即可。
十一,染色棋盘
十二,对称之美
十三,磁极分布
十四,完美重叠
十五,傅里叶残影
假设长度为a,转速为r,则轨迹方程是:
x(t)=∑a sin(rt) y(t)=∑a cos(rt)
代码实现:
int main()
{
int size = 200;
Mat img = Mat::zeros(size, size, CV_8U) + 255;
img.at<char>(size / 2, size / 2) = 0;
int a[] = { 1,2,3,2,2 };
int r[] = { 1,2,2,3,2 };
int n = sizeof(a) / sizeof(a[0]);
for (int i = 1; i < n; i++)r[i] += r[i - 1];
for (double t = 0; t < 50; t += 0.01) {
double x = 0, y = 0, rs = 0;
for (int i = 0; i < n; i++) {
x += a[i] * sin(r[i] * t), y += a[i] * cos(r[i] * t);
}
img.at<char>(size / 2 - y * size / 20, x * size / 20 + size / 2) = 0;
}
imshow("img", img);
cv::waitKey(0);
return 0;
}
把r换成int r[] = { 1,2,2,3,3 };
十六,蜂窝幻方
十七,六边速滑
十八,数阵迷踪
十九,九鼎之局
二十,数字迷途
二十一,极夜之途
把16个4*4的块拼接摆放,连出最长路径(三种块分别限定为竖,横,拐弯),起点和终点都必须是拐弯块。
可以把这个问题分成两层,顶层是16个块的排布问题,底层是求最长链路的问题,2个问题并不独立。
我随便找了个块试一下,看下有多少个不含端点的路径:
情况还是蛮多的。
二十二,无限扑克
无限扑克项目,其实只需要简单的技巧,就可以大大降低记忆量。
我以10*20的表格为例,说明如何通过30个数字取代200个数字,即可完成整个无限扑克项目。
按照CRC算法的思路,如何根据行和和列和就能推导出两两交换的位置?
我这里提供一个实测,不是严谨的证明,不过这个例子包含的内容很丰富,应该能cover住所有的实际情况。
1,制作题面
随便搞200个数字,统计行和、列和
交换4组数字,每组2个
这个例子里面包括了8个数字里面有2个相同数字的场景(当然,这2个不是同一组),也包括了一组的2个数字在同行或同列的场景,也包括了不同组的2个数字在同行或同列的场景。
2,汇总题面
3,推理破解
(3.0)
先做差分计算:
C列+20,D列-20,H列+17,I列-17,N列-5,R列+5,
3行+20,4行-8,5行-12,6行-5,10行+5
(3.1)
再做关联推理,应该是C3+20,C3现在是42,原来应该是22,刚好D4是22,这就是第一组答案。
去掉第一组答案,刷新差分:
H列+17,I列-17,N列-5,R列+5,
4行+12,5行-12,6行-5,10行+5
(3.2)
再做关联推理,分析差分17和差分12,有2种情况:
(a)差分17包括差分12,交换位置在H列、I列、4行、5行这几个位置
对比数据发现不一致
(b)差分17和差分12是独立的
分析差分17,H列+17,I列-17,发生在同一行,很快我们找到H6、I6,这就是第二组答案
去掉第二组答案,刷新差分:
N列-5,R列+5,
4行+12,5行-12,6行-5,10行+5
(3.3)
再做关联推理,差分12应该是同一列的2个数,差分5是R10和N6,这就是第三组答案
第四组答案也很容易找到,Q4和Q5
(3.4)答案汇总
C3、D4
H6、I6
R10、N6
Q4、Q5