華容道系列 開篇 《華容道與資料結構》

2021-04-02 09:19:45 字數 1395 閱讀 1797

此為轉貼,原文出處:

本系列內容將分成兩大部分:《華容道與資料結構》以及《華容道與設計模式》,兩者之間會有一些交叉。

這個學期給學生上《設計模式》的課程,有些學生提出找些題目練練手,增強一些實戰經驗,我決定讓他們編寫"華容道"遊戲。說實在的,當時並沒有深思熟慮。後來自己仔細想想,發現這裡面東西還真不少,甚至包括下學期我才給他們開設的課程《資料結構》中的大量內容。所以我決定自己先來嘗試一下。

其實編寫"華容道"的想法早在上大學時就有了,那時候我在《科學》雜誌上讀到胡華旦的一篇文章《"華容道"難題的計算機解》後心潮澎湃,非得用c語言寫乙個,可最終因為種種原因沒有做成,現在也是圓我的乙個夢想吧。

目前網上能夠搜尋到很多"華容道"計算機解的源**,但用物件導向語言站在資料結構以及設計模式角度編寫的幾乎沒有。我想嘗試成為第乙個吃螃蟹的人。在正式開始寫這個系列之前,我曾經考慮過很久將**定位在乙個什麼層面上,是教學還是應用。其實資料結構與設計模式的應用是乙個很自然的事情,不應該為了模式而模式,但出於教學目的又必須明確用了哪些模式,這又違背了模式的思想,我會盡量找到乙個合適的平衡點。另外,為了兼顧記憶體使用和運算效率以及通用性的要求,最好能夠應用泛型程式設計,但目前絕大多數人恐怕還在使用.net 2003,所以我最終選擇了放棄泛型技術。

最後,由於本人水平有限,而且是邊做邊寫,難免會有些疏漏,希望大家能夠諒解。

我們在程式中研究的棋盤布局的限制條件是:最大子只允許有乙個;最小子允許有4或8個(棋子總數相應為10至12個),其餘棋子任選;棋盤上必須和只允許有兩個空格。

另外需要明確的就是棋盤上任意兩個相同形狀、相同擺放的棋子是"同質"的,在計算機看來沒有任何區別。如圖:

計算機將認為以上兩個棋局是完全相同的,也就是說計算機不會記錄"人物"資訊,只儲存"布局"資訊。這樣做的目的一方面可以減少記憶體空間占用,另外一方面可以將ui與解題過程剝離開,降低耦合,允許各自變化。

下面的布局是網上乙個公開源**的vb6.0程式,作者劉峻松,email位址([email protected])。在他的程式中是這樣描述乙個棋盤布局的:

棋盤狀態說明:用12個整數來表示棋盤的開始狀態,每個整數用兩位表示,目前的演算法只支援5員大將,大將可以橫放,也可以豎放。棋盤的大小為高度5,寬度4,從上到下,從左到右為棋子位置來排號,其中第一位是曹操的位置,2-6代表5員大將,7-10代表4個小卒,11-12代表兩個空格的位置。整個棋盤的取值範圍是1-20,當曹操走動第14個位置時行走成功。初始化的狀態"021801040912101114151720"代表"橫刀立馬"布局。

在這個表述中,12個整數將占用12×4=48個位元組。即便用字串來描述的化,每個布局還是要占用24個位元組的長度。在進行乙個複雜棋局的運算中,這樣的布局要生成幾萬個,會占用1m左右的空間。算上其它內容,記憶體占用還會更大。

(待續)

華容道解題報告

基本思想 廣度優先遍歷搜尋所有可能棋局。實現方法 1.棋子的型別 hrd.h define chess blank 0 空白 define chess g4 1 四格棋子 define chess g2h 2 橫向兩格棋子 define chess g2v 3 縱向兩個棋子 define chess...

華容道程式求解

題解部落格 blog.lzh.today klotski solver 專案分期計畫 實現對橫刀立馬布局的求解,匯出步驟快照 實現對標準華容道滑塊 卒 五虎上將 曹操 任意布局的求解 實現對任意自定義滑塊 自定義棋盤的求解 技術路線 spring boot,junit 閱讀建議 新頁面開啟關鍵類圖,...

華容道遊戲破解PHP版

參見下面的文章,華容道用c 寫出破解後,感覺程式實在是簡單,於是嘗試移植到其他語言上 僅僅是簡單移植,沒有特別優化,執行時間如下 class huarongdao work join work 重複檢查 if this isduplicate work return 加入下一步,記錄父節點 this...