SimonHome
title

緣起
       
        學生時期,家中一直有一個智慧拼盤(似圖1, 參1),不清楚來源,可能是買奶粉送的吧?偶爾會拿來玩玩。大學時,有一次老師剛好出了一題”求解智慧盤”(圖2)的作業,於是就花了時間研究它的解法;當年的電子檔已不存在,只剩列印的文件。2000年左右,小孩在玩立體拼盤(3D Pentominos)(如圖3), 但卻沒人能拼回(太難了吧,只能當積木玩),於是利用離職前兩個星期,重新改寫此一程式並支援三維,才把借來的立體拼盤給拼回去!


IQ-Create
homework
智慧拼盤 (圖1) 求解智慧盤-列印封面 (圖2)


3dpentomino
3D Pentominos (圖3)

拼盤的玩法

        拼盤中不同形狀的塊體稱為多方塊(Polyomino),是由多個方塊組成,不同個數的組合,又有不同名稱如俄羅斯方塊是由4個方塊組成稱 Tetromino,而5個方塊組成稱為Pentomino(參2)。拼盤的玩法非常簡單,就是將多方塊完全放入拼盤中即完成;通常只要多點耐心,多試幾次就可以完成,與智慧無關吧,智慧二字應該只是商人的噱頭。

拼盤與程式

        拼盤的程式解法,是使用回溯法(Backtracking)即試錯(Trial and error)的方式來解出答案的,關於回溯法請參考另一篇文章:回溯法;這裡主要說明多方塊如何擺放的過程。

  (1) 經由旋轉(rotate)及反轉(flip)產生所有可擺放的多方塊形狀。
        一個多方塊最多有八種可擺放的形狀,例:
polyomino
        多方塊經 6次順時針90度及 1次左右反轉,最多產生 8種不同形狀。


  (2) 試著將多方塊先左而右,再由上而下的放入拼盤內,如下圖:
coordinate       
因左而右再上而下,所以將多方塊的最左上(先取最上再取最左)坐標設為(0,0),並經由順時90度及左右反轉找出所有的形狀:

(2.1) 多方塊順時90度:
   
        (2.1.1) 坐標順時90度: (X, Y) ==> (-Y, X) 

        (2.1.2)  排序:依先比Y再比X的方式排序。

        (2.1.3) 將排序後最小值轉移至(0,0),即為所求。

       範例說明:
   rotate
(2.2) 多方塊左右反轉:

        (2.2.1) 坐標左右反轉: (X, Y) ==> (-X, Y)

        (2.2.2) 排序:依先比Y再比X的方式排序。

        (2.2.3) 將排序後最小值轉移至(0,0),即為所求。

       範例說明:
flip

  (3) 擺入一多方塊後,依由左而右由上而下的找下個可擺放的位置,若同一多方塊的所有形狀均無法擺入,就取下一個未擺放的放入,
        若全部未擺放的多方塊均無法放入目前的位置,就取出上一個已放入的換成另一塊來放,直到所有多方塊均放完或已擺滿拼盤,
        則為一組解,反覆上述動作直到求得所有解或所欲求解的個數。(參3)

求解智慧拼盤

         JavaScript:
       
  求解智慧拼盤(JavaScript)

        另外 2000年時,C 語言所寫:matrix.zip (僅供參考, include 3D version, compile using gcc with cygwin)

        在學生作業列印文件中,有一段內容記載著當時求解的時間,如下圖:

         
workingTime
       
        當時是以C語言完成,在 286-10@10MHz 的機器要10小時以上,在386-33@56MHz 的機器也要 2小時以上,
        這應該有含顯示到螢幕的時間,而目前使用 Intel Core2 Duo P8700 @ 2.53GHz 在 Chrome (版本 25.0.1364.172 m) 上執行 
        Tetromino 全解(JavaScript),只要10秒 (Total answers = 99392, Elapsed Time : 10.418s, 不含顯示時間 )。

智慧拼盤遊戲

        智慧拼盤的遊戲是用 JavaScript 寫成,動態動作是以 KineticJS javascript framework 完成,遊戲中的每道題目,提示按鈕 及 即時檢查
        均是由求解函式所完成,程式可於 Chrome, FireFox , IE9 下執行,但有用到 HTML5 的 localStorage 只有 Chrome 可正常運作。



pentomino


程式原始碼

        GitHub: https://github.com/SimonHung/Polyomino-Puzzle
        Simon's GitHub Projects: https://simonhung.github.io

參考資料

        (1) 魔術拼盤: http://blog.udn.com/puzzlez/3495793
        (2) Polyomino wiki: http://en.wikipedia.org/wiki/Polyomino
        (3) Pentominos Puzzle Solver: http://godel.hws.edu/java/pent1.html

04/04/2013 如有版權問題,請告知。