马后炮一篇 关于Futurama S06E10中的数学问题

时间要追溯到2013年9月,我看到过这样一个有趣的问题,来源于matrix67的一篇博文

那么把题目摘录一下:

“ 经典 Geek 动画 Futurama 上周播出了第
6 季的第 10 集 The Prisoner of Benda 。在这一集中,教授
Farnsworth 发明了一种“心灵对换机”,它可以把两个人的思想互相对换,使得 A 的大脑跑进 B 的身体里,而 B 的大脑则跑到 A 的身体里。 Farnsworth 和 Amy 都想得到对方的身体,便成为了这台机器的第一对实验者。等到他们爽够了想换回来后, Farnsworth 却发现了一个严重的问题:已经互换过大脑的两个身体不能再次进行大脑对换操作。但这并不表示两个人完全没有希望回到自己的身体里—— Farnsworth 突然想到,或许可以用第三者作为一个临时的大脑储存空间,从而实现间接对换。正巧机器人
Bender 进了实验室,于是(身为 Amy 的) Farnsworth 和 Bender 又坐上了机器,这下 Farnsworth 的大脑便跑到 Bender 身体里了,而 Bender 的大脑则进了 Amy 的身体里。此时 Farnsworth 才意识到,引入一个第三者是不够的——再让(身为
Bender 的) Farnsworth 和(身为 Farnsworth 的) Amy 互换大脑,可以让 Farnsworth 恢复原状,但同时 Amy 的大脑会跑到 Bender 的身体里去;这样 Bender 和 Amy 的身体正好颠倒了,而他们却已不能再次使用机器。换句话说,要想恢复两个换位了的大脑,需要引入不止一个新的人。

但现在,问题已经变得更加复杂了——这下已经产生了三个大脑位置错乱的人。大家很容易联想到一个更一般的问题:给定 n 个人以及他们之前使用“心灵对换机”的记录,至少得引入多少个新的人,才能让所有人的大脑都“物归原主”呢?”

条件需要注意的是:n个人两两之间可能都已经换过了,所以后续的交换只能在新人和旧人,新人和新人之间互换。

在原先的文章里,最后给出的解答是这样的:

无论此前n个人的交换有多混乱,最后只需要引入两个人,可以让大家复原。

躯体:1  2  3  4  5  6  …  k-1  k

大脑:2  3  4  5  6  7  …   k   1

首先解答这样一种特殊的情况

在2  3  4  5  6  …  k  
1  的情况下,可以通过一种构造性的置换方法

2  3  4  5  6  …  k   1  x  y

x  3  4  5  6  …  k   1  2  y

x  y  4  5  6  …  k   1  2  3

x  y  3  5  6  …  k   1  2  4

x  y  3  4  6  …  k   1  2  5

x  y  3  4  5  …  k   1  2  6

… … …

x  y  3  4  5  … k-1  1  2  k

x  y  3  4  5  … k-1  k  2  1

x  2  3  4  5  … k-1  k  y  1

1  2  3  4  5  … k-1  k  y  x

1  2  3  4  5  … k-1  k  x y

但是如何面对一般的情形呢?

原文是这样解释的:

“注意到一个 1 到 n 的排列总能分解成若干个循环的乘积,对每个循环分别进行上述操作 ”

我觉得这句话并没有把这个解答解释得比较充分,让人不太明白,这是这篇文章比较遗憾的地方。

下面说一下我的思考吧

首先,引入这样一个问题。

一个排列,每个数字i都不在第i个位置上,需要多少次交换,才能变换到1,2,3, ..., n-1, n

例如排列 2  4  1  3,最少需要3次交换。排列 2  1  4  3则只需要2次交换。

因为前者{1,2,3,4}构成了一个全乱环,后者{1,2}   {3, 4}构成了2个全乱环(额...全乱环,姑且这么描述吧,暂时没找到正规俗语-_-||)。

排列 1 3 4 2不是我们考虑的情形,因为1在第1个位置。

在一个大小为n的完全乱序环中,最少需要n-1次交换,才能还原。

我们暂时考虑这样的排列:每个数字i都不在排列的第i个位置上,并且需要通过n-1次交换才能还原到1
2 3 4  ... n-1 n

如果只引入一个人x,策略是依次把1,2,3,4心灵换到身体上(红色表示旧人和新人已经做过交换)

2  4  1  3  x

2  4 
x  3  1

1  4  x  3  2

1  2  x  3  4

1  2  x  4
 3

好,到这里比较尴尬了,因为第一次5号身体和3号已经换过了所以不能再换了

怎么办?

那么只好引入第2个救星了y。他的作用是先和装有1号心灵的身体互换,避免x最后无法交换的困境

2  4  1  3   x  y

2  4
 y  3   x  1

x
 4  y  3   2  1

x  2  y  3   4  1

x  2  y  4   3  1

只有x一个人时的困境不再了,3可以和y交换了

x  2  3
 4  y  1

1  2  3  4  y  x

1  2  3  4  x  y

总之,解决的办法就是:

1)y先和1号心灵交换,

2)然后由x的身体把2,3,4,... n按照心灵的顺序各归其位,

3)再由y的身体把1号归位,

4)最后x y互换。

于是,各归其位,世界和平了。 :D

等等,我们刚才说了排列中只有一个全乱环的情况,如果有多个全乱环呢?

其实很简单,对每一个全乱环都用上述的方法单独处理就行了。

马后炮一篇 关于Futurama S06E10中的数学问题,布布扣,bubuko.com

时间: 2025-01-15 01:06:53

马后炮一篇 关于Futurama S06E10中的数学问题的相关文章

Android总结篇系列:Activity中几个主要函数详解

专注Android领域开发. 仰望星空,同时需要脚踏实地. ——好记性不如烂博客 Android总结篇系列:Activity中几个主要函数详解 Activity作为Android系统中四大基本组件之一,包含大量的与其他的各大组件.intent.widget以及系统各项服务等之间的交互的函数.在此,本文主要选取实际项目开发中常用的,但完全理解又需要有一定深入了解的几个函数进行讲解,后续本文会根据需要不断更新. 1. startActivityForResult / onActivityResult

第五篇:在SOUI中使用XML布局窗口

窗口布局的概念 每一个UI都是由大量的界面元素构成的,在Windows编程,这些界面元素的最小单位通常称之为控件. 布局就是这些控件在主界面上的大小及相对位置. 传统的布局一般使用一个4个绝对坐标来定义一个控件在主窗口的位置.对于窗口是固定大小的界面来说,这种方式是最简单有效的. 然而问题在于在Windows系统上编程,基本上很少有程序的窗口是固定大小的,用户希望它的窗口能够随时调整大小.调整大小后界面里的控件还能够按照一定的规则进行重排. 我自己最讨厌的就是在WM_SIZE里重排控件位置. 随

JAVA学习篇--ThreadLocal,Java中特殊的线程绑定机制

在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个connection连接).那么ThreadLocal是如果做到的呢?它和同步锁的不同在哪里? 是什么: 对于ThreadLocal看英文单词我们很容易理解为一个线程的本地实现,但是它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLoc

[再寄小读者之数学篇](2014-07-27 $H^{-1}$ 中的有界集与弱收敛极限)

设 $H^{-1}$ 是 $H^1_0$ 的对偶空间, 定义域为 $[0,1]$. 试证: (1) $\sed{h\sin (2\pi hx);\ h>0}$ 在 $H^{-1}$ 中有界; (2) 试求 $h\sin (2\pi hx)$ 在 $H^{-1}$ 中的弱极限. 证明: (1) 对 $\forall\ f\in H^1_0$, $\sen{f}_{H^1}\leq 1$, $$\beex \bea \sef{h\sin (2\pi hx),f(x)}&=\int_0^1 h\s

Java基础篇Socket网络编程中的应用实例

说到java网络通讯章节的内容,刚入门的学员可能会感到比较头疼,应为Socket通信中一定会伴随有IO流的操作,当然对IO流比较熟练的哥们会觉得这是比较好玩的一章,因为一切都在他们的掌握之中,这样操作起来就显得非常得心应手,但是对于IO本来就不是多熟悉的哥们来说就有一定的困难了,在搞清楚IO流操作机制的同时还必须会应用到Socket通信中去,否则会对得到的结果感到非常郁闷和懊恼,下面就和大家一起分享一下自己遇到一点小麻烦后的感触以及给出的解决办法. 要求:客户端通过Socket通信技术上传本地一

Cocos2d-x3.0游戏实例之《别救我》第九篇——从tmx文件中加载关卡怪物

上一篇我们已经制作好tg1.tmx文件了,现在就要使用它了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blog/archives/944 文章来源:笨木头与游戏开发 很抱歉,我们又要新建2个类了,我已经尽力少新建类了,毕竟是教程,类越多越容易混乱. 我们要新建一个Monster类,以及一个MonsterLayer类,专门添加Monster对象. Monster类 来看看Monster.h文件: #ifndef Monste

两篇论文之CNN中正交操作

CNN的权值正交性和特征正交性,在一定程度上是和特征表达的差异性存在一定联系的. 下面两篇论文,一篇是在训练中对权值添加正交正则提高训练稳定性,一篇是对特征添加正交性的损失抑制过拟合. 第一篇:Orthonormality Regularization Xie D, Xiong J, Pu S. All You Need is Beyond a Good Init: Exploring Better Solution for Training Extremely Deep Convolution

一篇英文文档中找出频数最多的10个单词

"""一篇英文文档中找出频数最多的10个单词collections: Counter 提供计数器工具以支持方便和快速的计数 most_common(n) 返回n个最常见元素及其计数的列表,从最常见到最少. 如果省略nNone,则 most_common()返回计数器中的所有元素."""import refrom collections import Counter# print(dir(Counter))with open('english.tx

word2vec 中的数学原理详解

word2vec 中的数学原理详解 word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Mikolov 在两篇相关的论文 [3,4] 中并没有谈及太多算法细节,因而在一定程度上增加了这个工具包的神秘感.一些按捺不住的人于是选择了通过解剖源代码的方式来一窥究竟. 第一次接触 word2vec 是 2013 年的 10 月份,当时读了复旦大学郑骁庆老师发表的论文