owenzhang的博客

crazy matching想到的数学原理

字数统计: 900阅读时长: 3 min
2024/06/04
loading

周末和孩子玩一种卡牌叫「crazy matching」,发现很有数学规律,后面研究了下还挺有意思。

包装盒上印着的就叫「crazy matching」,玩法也很简单,随机翻两张牌,看谁先找到两张牌相同的图案。用来训练小孩子的反应速度。

突然想到一个问题:任意两张牌有且仅有一个卡通物品相同,一副牌55张,最少要设计多少个卡通物品?要怎么生成一副牌?

例如下图的四张牌,任意两张仅有1个卡通相同。

当天没有想出来,后来和组内的小伙伴问了下,他也没想出来,但是给我到知乎找了两个帖子

https://www.zhihu.com/question/346371561?utm_id=0

https://www.zhihu.com/question/309408759?utm_id=0

很遗憾,这两个帖子都没看懂,不过还是有很大收获的。

在国外叫多比那尔套牌(Dobble或Spot it!),crazy matching应该是国内起的名字。

已经有人研究过数学原理,不过我没看懂😅,用空间几何来解决,还可以用向量。

后来我想用程序枚举,随机生成再检验。还没写出程序时,突然有了对向量的灵感。用excel模拟了下,竟然构造出了答案。

如果要构造一副牌,最简单的方式55张牌相同的都是同一个卡通。55张牌共有55*7+1种卡通,得到上限。除了1个图案相同,剩下每张牌其余7个图案都不同。

如何得到下限呢?用表格模拟向量,构造一副牌。

具体方法如下:

  1. 每一列代表一张牌,每一行代表一种卡通图案。一列中为1的行,表式这张牌拥有的卡通图案的编号。
  2. 生成第一张牌:第一列表式用1-8编号的卡通,凑成一张牌。
  3. 生成第二张牌:第二列有1号卡通,但是不能有2-8号卡通,有9-15号卡通。把第二列从9-15行都置为1。
  4. 生成第三张牌:第三列是有1号卡通,但不能和前两列重复其他牌,要新增22-29号卡通。

以此类推,构造出8号牌,此时一共用了57个卡通。

这8张牌,任意两张有且仅有1张相同,相同的卡通在1-8号卡通集合中。

行越多,用的卡通越多。在构造第9张牌的时候,我们尝试用2号牌作为重复牌,然后复用已有的57个卡通,保证新增的牌任意两张只有1个卡通相同。

所以第9张牌,剩下的7个卡通,从2-7号牌各取一个相同卡通,构造如下图,仍然能够保证有且仅有1个卡通相同。

以此类推构造出第57张牌,总共有57个卡通,仍然满足特性。

从图像的样子看,也很有规律,验证也是正确的。

以上的方法是用表格模拟出来的,还不足以证明数学原理。但是对于工程实现来说够用了。

如果重新做一副牌,只需要按照上面的表格做57个卡通图案,然后按照列的方式印刷到牌面上,就有一副「自研」的牌了。

当然复刻一副牌,还有更简单的办法,直接买一副印好的牌,把别人的卡通和自己的开通做个映射表,一比一复刻比我上面的折腾要更简单。

CATALOG