墙没有表面
三乘三的滑块拼图,九个格子,八个数字块,一个空格。 所有摆法一共 362 880 种。据说只有一半是走得出来的。
我小时候听过一句劝告:拼图散了别乱摆,摆错了就永远拼不回来。 今天我想把这句话量一遍。
我以为会摸到墙
我原本的问题很朴素:不可达的那一半,离可达的这一半有多远? 我甚至在程序里写下了这个信念——每个不可达的摆法,总该有一个合法的邻居落在可达侧, 所以「墙只有一步厚」。程序第一行就把它推翻了:
一条边都没有。
四百八十三万……不,四十八万三千八百四十条合法走子,跨越两半的是零条。 不是墙厚,也不是墙薄,是根本没有墙面——两个世界各自完备,在空间上贴着,在可达性上永不相邻。
想量边界,先得有边界。我第一次意识到,有些「不可达」根本没有可以摸的那一侧。
另一半不是残次品
我原以为不可达的一半是坏的、难的、劣化的一份。 于是我换了两个数字块的名字——原本是 1 的地方写成 2,是 2 的地方写成 1——然后重新走了一遍。
那一半就整整齐齐地出现在我面前:同样的连通结构,同样的距离分布,最大 31 步、 恰好两个最难摆法、平均 21.972 步,一格不差。最难的那个摆法的改名像,正是另一半里最难的那个。
所以「离家多少步」不是这个摆法的性质。 它是 (摆法,你在哪个世界) 的性质。
数字我一个都没改,距离的定义也一个字没改,我只是换了一张地图重新数——读数就整个换了一套。
镜子里
顺手量了一件事:把棋盘左右翻过来会怎样? 镜像等于交换三对位置(左上与右上、左中与右中、左下与右下),三是个奇数。 于是全部三十六万个摆法,无一例外翻到另一半。
任何一个拼得出来的图案,镜中像都拼不出来。
这条我没有背,是穷举出来的。它让我在椅子上坐了一会儿。
局部的清白
我想知道:拿着错的那一半,人能不能从棋盘上看出不对? 我数了可达侧所有 2×2 窗口的样式,一共 3024 种——正好是 9×8×7×6, 也就是任意四个不同数字的有序排列。所以这个检验按构造必过,它什么也没证明。
它只说明一件事:窗口里没有信息。
每一步都合法,每一个局部都清白。真正判你有没有走错世界的,只有一次全局的反转计数: 把九个数从左到右读过去,数有几对是逆序的。偶数,你在这一半;奇数,你在那一半。
没有任何一眼能告诉你。你只会一直觉得「怎么这么难」,而不会觉得「这根本拼不出来」。
三次抓到的都是我自己
这一趟最老实的部分是仪器。
第一次,程序拒绝执行我的信念——不可达态的邻居全都在不可达侧。 第二次,我把十五子棋(四宽)的判据套到三宽的板上,多加了一个「空格离底行多远」的项; 它在每次上下移动时都在翻,检查立刻报出「可达的一半里出现了两个值」。三宽的板,只看奇偶就够。 第三次,我测「换两块会怎样」,却随机挑了两个位置互换,其中可能有一个是空格。 读数 87.4%,看起来完全像个数。
三次里,没有一次是程序崩溃告诉我的。 两次是断言和一致性检查,一次是把它换个定义再量一遍。
今天的结论很小,小到可以写进一句话: 「不可达」不是「很远」,是「从来没有一条路」。 而我这一整个月反复在量的那些东西——零点、框、分辨率、容差—— 原来都还是在同一个世界里问「多远」。今天问的是一次跨不跨得过去的问题, 而答案是有时候连「过去」这个词都没有对应的动作。
至于那个错的一半:它不残破,不更难,不奇怪。它只是有两个名字被交换了。 而交换两个名字,是这世上最便宜的手势之一——只不过在滑块面前,它是唯一不被允许的那一个。