随机走路时怎样擦掉回路形成一条简单路径:状态推演第26例
走迷宫时可能反复回到已经到过的位置。按时间顺序擦除回路,可以从一条有重复的行走记录中留下不重复经过顶点的路径,而且相邻位置仍然相连。
先把规则写清楚
从起点开始保存一条路径,每收到下一个位置就检查它是否在当前路径中。若不存在就追加;若已存在,就保留到该位置为止的前缀,删除其后所有位置。判断依据是当前路径,而不是整段历史里是否出现过。
本例输入与推演结果
五乘五网格,坐标从零到四,只允许上下左右移动,表格包括起点和后续二十八步。
步数 | 输入位置 | 本步擦除段 | 当前简单路径 0 | (0, 0) | [] | [(0, 0)] 1 | (1, 0) | [] | [(0, 0), (1, 0)] 2 | (2, 0) | [] | [(0, 0), (1, 0), (2, 0)] 3 | (2, 1) | [] | [(0, 0), (1, 0), (2, 0), (2, 1)] 4 | (2, 2) | [] | [(0, 0), (1, 0), (2, 0), (2, 1), (2, 2)] 5 | (2, 3) | [] | [(0, 0), (1, 0), (2, 0), (2, 1), (2, 2), (2, 3)] 6 | (2, 2) | [(2, 3)] | [(0, 0), (1, 0), (2, 0), (2, 1), (2, 2)] 7 | (2, 1) | [(2, 2)] | [(0, 0), (1, 0), (2, 0), (2, 1)] 8 | (3, 1) | [] | [(0, 0), (1, 0), (2, 0), (2, 1), (3, 1)] 9 | (3, 0) | [] | [(0, 0), (1, 0), (2, 0), (2, 1), (3, 1), (3, 0)] 10 | (2, 0) | [(2, 1), (3, 1), (3, 0)] | [(0, 0), (1, 0), (2, 0)] 11 | (1, 0) | [(2, 0)] | [(0, 0), (1, 0)] 12 | (2, 0) | [] | [(0, 0), (1, 0), (2, 0)] 13 | (1, 0) | [(2, 0)] | [(0, 0), (1, 0)] 14 | (2, 0) | [] | [(0, 0), (1, 0), (2, 0)] 15 | (2, 1) | [] | [(0, 0), (1, 0), (2, 0), (2, 1)] 16 | (2, 0) | [(2, 1)] | [(0, 0), (1, 0), (2, 0)] 17 | (2, 1) | [] | [(0, 0), (1, 0), (2, 0), (2, 1)] 18 | (1, 1) | [] | [(0, 0), (1, 0), (2, 0), (2, 1), (1, 1)] 19 | (1, 2) | [] | [(0, 0), (1, 0), (2, 0), (2, 1), (1, 1), (1, 2)] 20 | (1, 3) | [] | [(0, 0), (1, 0), (2, 0), (2, 1), (1, 1), (1, 2), (1, 3)] 21 | (1, 2) | [(1, 3)] | [(0, 0), (1, 0), (2, 0), (2, 1), (1, 1), (1, 2)] 22 | (1, 1) | [(1, 2)] | [(0, 0), (1, 0), (2, 0), (2, 1), (1, 1)] 23 | (0, 1) | [] | [(0, 0), (1, 0), (2, 0), (2, 1), (1, 1), (0, 1)] 24 | (0, 2) | [] | [(0, 0), (1, 0), (2, 0), (2, 1), (1, 1), (0, 1), (0, 2)] 25 | (1, 2) | [] | [(0, 0), (1, 0), (2, 0), (2, 1), (1, 1), (0, 1), (0, 2), (1, 2)] 26 | (1, 1) | [(0, 1), (0, 2), (1, 2)] | [(0, 0), (1, 0), (2, 0), (2, 1), (1, 1)] 27 | (2, 1) | [(1, 1)] | [(0, 0), (1, 0), (2, 0), (2, 1)] 28 | (3, 1) | [] | [(0, 0), (1, 0), (2, 0), (2, 1), (3, 1)]
这里的编号只用来辨认本例中的对象,不能当成另一份记录里的固定身份。阅读表格时先找到输入,再顺着运算顺序对照输出;空列表、零值和不存在的结果有不同含义,不能混用。表中分数保留精确值,小数显示仅为阅读方便。
怎样自己复核
每一步输出路径都应从原起点走到当前输入位置,内部没有重复顶点,每一对相邻格子都相邻。被擦掉的格子以后可以重新进入路径,不能用一个永远不清理的已访问集合阻止它。
保留每次删除了哪一段,有助于区分简单回头与较长环路。若要继续生成整张迷宫,还需要说明怎样选择新起点、何时接入已有树以及怎么结束;这些不属于本例的单条路径清理步骤,不能从一条示例推广为完整生成器。
适用范围
这只是对一条给定行走序列进行回路擦除,不保证剩余路径是起点到终点的最短路线,也不直接证明任何迷宫生成概率性质。倒着处理同一条记录可能得到不同路径,时间顺序是规则的一部分。
本例是一套可复现的游戏机制练习,不依赖具体品牌或某个软件的默认设置。修改任何边界约定、输入参数或操作顺序后,应重新推演并保存中间状态。发现差异时先定位第一处不一致,再判断是规则不同还是计算错误,不要只把最终答案调整到看起来相同。