困難的 Klotski 拼圖是一種滑塊挑戰,其難度來自規則本身,而不是文化命名:每個方塊都保持固定的佔位,每個接受的動作只會將選定的矩形正交移動恰好一格,而唯一逃出的方式,是讓一個 2 by 2 的方塊穿過底部的雙欄開口。在一個緊湊的 4 by 5 棋盤上,有六個公開的起始方塊,Klotski 工具所呈現的原始布局具有可證明的最少六次原子移動。這個最少次數並非社群說法或排行榜估計;一個獨立的廣度優先搜尋發現了 3,234 個獨特的棋盤狀態,並展開了 1,470 個佇列項目,才在深度六時讓第一個獲勝狀態離開佇列,從而排除了所有五次或更少原子移動的路徑。

這類拼圖之所以感覺困難,是因為規則集剝奪了休閒玩家可能嘗試的所有捷徑。沒有對角線滑動、沒有旋轉、沒有跳躍、沒有瞬間移動,也沒有沒有兩格跨步。1 by 1 的方塊只能將自己推入一個相鄰的空格,而 1 by 2 的柱子必須以剛性的雙格矩形方式移動。2 by 2 的目標方塊是唯一夠大、能填滿出口佔位的方塊,因此這個拼圖簡化為一個規劃問題:如何清理中央通道,卻永遠不會把另一塊方塊卡進你之後需要退出的角落?

hard klotski puzzles
困難的 Klotski 拼圖:以六步解開原始布局

為什麼原始布局很困難

原始的 Lizely 布局刻意將難度壓縮進 11 個佔用格與 9 個空格。每一格都很重要,因為每次原子移動至少需要一個朝移動方向的空格。棋盤限制為四欄五列,欄位從零到三編號,列從零到四編號,因此錯誤的一步可能會將矩形困死在外牆上,沒有逃脫路線。

方塊的組成本身是第二個難度來源。兩個 1 by 2 的柱子位於最外側欄的第零列,夾住 2 by 2 的目標方塊。三個 1 by 1 的方塊(Slider、Guard 與 Gate)分別佔據中間列的 x=1 y=2、x=0 y=2 與 x=2 y=2。該列是守門員:在 x=1 y=2 的 Slider 清開目標方塊的左下通道、x=2 y=2 的 Gate 清開右下通道之前,2 by 2 的目標方塊無法從 y=0 下降到 y=3 的目標佔位。困難的 Klotski 拼圖成敗與否,在於解題者是否認真正瓶頸是中間列,而不是目標方塊。

方塊識別與起始座標

方塊尺寸左上角角色
目標2 by 2x=1, y=0必須到達 x=1, y=3(底列的兩個中央欄)
左柱1 by 2x=0, y=0封鎖第零列到第一列的左通道
右柱1 by 2x=3, y=0封鎖第零列到第一列的右通道
Slider1 by 1x=1, y=2最佳路線中第一個移動的方塊
Guard1 by 1x=0, y=2位於第二列的左側
Gate1 by 1x=2, y=2在最佳路線中清開右下通道

每個方塊的身分是固定的,每個起始座標是固定的,每個尺寸也是固定的。沒有隨機洗牌、沒有可設定的難度,也沒有替代的棋盤狀態。難度存在於幾何之中,而不是驚喜之中。

如何以六次原子移動解開困難的 Klotski

在 Klotski 拼圖工具上使用以下路線。移動的撰寫順序與正式程式碼執行的公開順序一致,每一行恰好是一個原子步驟。

  1. 選擇 Slider(數字鍵 4 或其選擇按鈕),向下移動到第四列,釋放 x=1 y=2 的格子。
  2. 保持 Slider 選取狀態,向左移入第零欄,將 Slider 停在 x=0 y=3,並清開目標方塊的左下通道。
  3. 選擇 Gate(數字鍵 6),向右移入第三欄,將 Gate 停在 x=3 y=2,並清開目標方塊的右下通道。
  4. 選擇 Goal(數字鍵 1),向下移入第一列,將目標方塊放在 x=1 y=1。
  5. 再次將 Goal 向下移入第二列,將目標方塊放在 x=1 y=2。
  6. 最後一次將 Goal 向下移入第三列,將目標方塊放在 x=1 y=3,完成公開的出口佔位。

當最後一次原子移動完成時,棋盤會剛好頒發 1,000 分。方塊選擇、移動與復原動作都會在那一刻凍結。再玩一次的唯一合法方式是按下 Restart,它會恢復全部六個原始位置、選取目標方塊、清空歷史記錄、將移動次數重設為零,並將分數歸零。

為什麼六是可證明的最少次數

許多滑塊拼圖所宣稱的「最少次數」其實只是傳說。這個布局不同,因為一次神諭式廣度優先搜尋——並未呼叫正式版的移動或碰撞輔助函式——徹底列舉了所有可達的狀態空間。每個狀態以已發布的方塊順序儲存為扁平座標向量。對於每個離開佇列的狀態,神諭獨立為五個不動方塊建立佔用格集合,為每個矩形嘗試上、下、左、右四個方向,排除超出邊界或發生碰撞的佔位,並將每個未曾出現的座標向量加入佇列一次。

該搜尋在深度六、第一個獲勝狀態離開佇列之前不會停止。在那之前,它發現了 3,234 個獨特狀態,並展開了 1,470 個佇列項目。因此,任何零、一、二、三、四或五次原子移動的路徑都無法到達底部開口。上面列出的六步路線並非眾多猜測中的某一條最短路徑;而是一條其最少次數已被機械驗證的路線。

隨正式版程式碼一同出貨的測試,透過真正的移動與碰撞輔助函式,重播 Slider 下、Slider 左、Gate 右、Goal 下三次的精確序列,然後驗證每個中間棋盤。接著將 Undo 作為回歸測試來執行:一次移動後接著 Undo 必須回到已發布的起始狀態,而不可變快照邏輯保證了這一點。

以 Undo 與 Restart 安全試驗

困難的 Klotski 拼圖通常需要幾次錯誤嘗試,才能領悟最佳路線。本工具支援那樣的學習循環,卻永遠不會破壞起始狀態。

  • 點擊棋盤上任一矩形,或按下其數字鍵(1 到 6),即可選取方塊。被選取的矩形會顯示可見外框,並在狀態文字中顯示其名稱。
  • 使用四個大型方向控制鈕或方向鍵,嘗試進行一格移動。若目的佔位超出邊界或與其他方塊碰撞,該次移動會以原子方式被拒絕,什麼也不會改變:位置、歷史、移動次數、分數與完成狀態都保持完全不變。
  • 按下 Undo(方向鍵盤下方的一個全寬度控制鈕,或 U、Delete 或 Backspace 鍵),即可回復最近一次接受的移動。Undo 會移除最新的快照,並還原其精確座標,將移動次數減一。
  • 隨時按下 Restart 即可重設回公開的起始狀態,即使在一次成功的 1,000 分遊戲之後也可重設。
  • 重複的 keydown 事件會被忽略,因此按住方向鍵不會讓方塊在多個未經檢視的狀態間衝過。

原生選擇按鈕透過 Tab 仍可供鍵盤使用者操作,並在指標事件時啟動,因此同一組控制對觸控、滑鼠與鍵盤玩家都同樣有效。

原子規則及其排除的狀況

每個接受的動作,只會將矩形的左上角正交改變恰好一格。矩形保持其公開的寬度與高度,絕不旋轉,也絕不跳過任何一格。在安裝任何一次移動之前,邏輯會建構完整的目標佔位,確認其仍位於 4 by 5 棋盤之內,並確認其與任何其他方塊沒有共用格子。若任一檢查失敗,該次移動便不會發生。

正是這種原子定義,使六步的最少次數具有意義。一個允許兩格跨步或 90 度旋轉的拼圖版本,將擁有更短的路徑與不同的證明;本布局不允許這些,且契約明確聲明,六步的結果僅適用於公開的原始布局及其精確的原子移動定義。它並不聲明與任何文化命名的布局或外部拼圖集合同等。若讀者在別處遇到不同的 Klotski 變體,則移動次數、最少次數與 BFS 統計數字皆不可移植套用。

計分、私密性與本地遊玩

計分刻意保持平坦。抵達出口剛好頒發 1,000 分;沒有其他因素會改變分數。沒有速度加成、沒有移動懲罰、沒有提示消耗、沒有部分給分,也沒有隨機調整器。共用的遊戲外殼也會在本地追蹤最佳分數,並提供一個雙 Escape 老闆鍵:在外殼計時窗口內連按兩次 Escape,即可用一個類似試算表的畫面蓋住拼圖,再按兩次即可返回。

所有遊戲過程都在瀏覽器本地執行。不會上傳任何棋盤狀態、移動歷史、結果或互動資料。本遊戲不需要帳號、相依套件、遠端 API、裝置權限或付費服務。此拼圖是休閒性質的空間規劃練習,並非標準化的智力、性向、教育或心理評量,因此分數應視為完成標記,而非能力度量。

如需更深入的檢視,請參閱 困難的騎士與騙子拼圖:從五題解到 1,000 題

如需更深入的檢視,請參閱 常見的 LITS 拼圖錯誤與如何避免