镜面迷宫里的光束可能离开地图,也可能在几面镜子之间不断绕圈。只记住经过哪个格子还不够,同一格从不同方向进入,后续路线可以不同。
地图五乘五,只含空格、斜杠镜面和反斜杠镜面。状态为横坐标、纵坐标、入射方向;先在当前格反射,再沿新方向走一格。方向零右、一向下、二左、三向上,地图外立即结束。斜杠镜把右入射变成向上、向下变成向左、向左变成向下、向上变成向右;反斜杠镜则把向右与向下互换、向左与向上互换。空格不改变方向。请先按这张方向表处理镜面,再移动位置,不能先走到下一格才读取上一格的镜子。
起始状态[3, 3, 3] 字符点表示空格 ///// ..//. ..... /../\ ...\/
第1次进入格[3, 3],入射方向3,符号/,离开方向0。
第2次进入格[4, 3],入射方向0,符号\,离开方向1。
第3次进入格[4, 4],入射方向1,符号/,离开方向2。
第4次进入格[3, 4],入射方向2,符号\,离开方向3。
共处理4个不同状态,接下来状态[3, 3, 3]。重复了索引0的状态,循环长度4。记录索引从零开始,重复状态不再算作新的处理步骤。循环起点之前的记录属于前缀,循环起点至重复之前的记录构成一整圈;只比较横纵坐标会忽略入射方向,可能把正常交叉经过误认成绕圈。
把每次进入格子的完整状态记录下来,第一次遇到重复状态即可证明后续会重复,因为同一状态始终只有一个后继。五乘五乘四最多一百种状态,不能把超时等待当成判断循环的方法。
练习时可以先遮住结果,沿用相同输入独立记录中间状态,再逐项比较。发现不同后先定位最早分歧,确认边界包含方式、编号起点、更新顺序以及是否提前取整。最后结果一致也不表示每个中间步骤都正确,因此保留过程记录有助于看清原因。
这是不分裂、无能量衰减的格子模型。若有分光镜,要跟踪多束光;若镜子会随回合旋转,还要把回合相位加入状态。这里的循环证明只适用于规则不会随时间改变的情况。