如何用Wolfram Language实现火柴移动数学谜题的可计算求解?
火柴移动谜题的Wolfram Language求解方案
问题回顾
桌上有三堆火柴,数量分别为11根、7根、6根。需在3步内通过移动火柴使每堆均为8根,规则如下:
- 仅能向某堆添加与其当前数量相等的火柴,且所有火柴必须来自另一堆;例如某堆有6根火柴,只能向其添加6根(从另一堆移6根过来),不可多也不可少。
实际存在可行解法:
- 从11根的堆中移动7根到7根的堆,此时三堆为4根、14根、6根;
- 从14根的堆中移动6根到6根的堆,此时三堆为4根、8根、12根;
- 从12根的堆中移动4根到4根的堆,此时三堆均为8根。
但原Wolfram Language代码返回空结果,以下是问题分析和正确实现:
原代码的核心问题
原代码错误地假设一步内同时对三个堆进行操作,通过联立方程试图一步完成所有变化,但实际上每一步只能操作一对堆:从一个堆移走等于目标堆当前数量的火柴,使目标堆数量翻倍,移出堆数量对应减少。这种逻辑完全不符合谜题规则,因此无法找到解。
正确的Wolfram Language实现
采用**广度优先搜索(BFS)**跟踪每一步的状态转移,确保在指定步数内找到可行路径:
(* 定义单步合法移动:从from堆移到to堆,验证合法性并返回新状态 *) validMove[state_, from_, to_] := Module[{newState = state}, If[from == to, Return[False]]; If[newState[[from]] < newState[[to]], Return[False]]; (* 移出堆需有足够火柴 *) newState[[to]] *= 2; newState[[from]] -= state[[to]]; {True, newState} ] (* 搜索指定步数内的解路径 *) findSolution[startState_, targetState_, maxMoves_] := Module[{queue, visited, current, movesLeft, path}, queue = {{startState, {}, maxMoves}}; (* 队列元素:当前状态、移动路径、剩余步数 *) visited = {startState}; While[queue =!= {}, {current, path, movesLeft} = First[queue]; queue = Rest[queue]; If[current == targetState, Return[Reverse[Append[path, current]]]]; If[movesLeft == 0, Continue[]]; (* 遍历所有可能的堆移动组合 *) Do[ {isValid, newState} = validMove[current, i, j]; If[isValid && !MemberQ[visited, newState], AppendTo[visited, newState]; AppendTo[queue, {newState, Append[path, current], movesLeft - 1}] ], {i, 1, 3}, {j, 1, 3} ] ]; Return[{}] (* 无符合条件的解法时返回空 *) ] (* 执行求解并格式化输出 *) start = {11, 7, 6}; target = {8, 8, 8}; maxSteps = 3; solution = findSolution[start, target, maxSteps] If[solution =!= {}, Print["找到可行解法:"]; Do[ Print[ToString[i] <> ". " <> ToString[solution[[i]]] <> " → " <> ToString[solution[[i+1]]]], {i, 1, Length[solution]-1} ], Print["未找到符合条件的解法"] ]
代码说明
validMove:验证从from堆到to堆的移动是否合法,合法则返回新状态;判断标准包括:移出堆和目标堆不能是同一堆,移出堆的火柴数量必须足够覆盖要移动的数量(即≥目标堆当前数量)。findSolution:使用BFS遍历状态空间,避免重复访问同一状态,确保在maxMoves步数内找到到达目标状态的最短路径。- 最后通过格式化代码输出每一步的状态变化,清晰展示求解过程。
运行上述代码后,会输出与手动解法完全一致的三步路径。
内容的提问来源于stack exchange,提问作者Jason Roell
相关产品推荐
相关产品推荐

