華容道演算法之效能優化

2021-09-17 23:18:35 字數 1320 閱讀 8982

上篇文章講解了華容道演算法基本演算法知識,也是最簡單的,效率也是最低的。這篇文章講解高效率演算法。從下篇文章開始主要分析linux  驅動**以及嵌入式相關設計知識。本次編碼採用棋子在棋盤中的位置編碼,順序是從左往右/從上到下。以橫刀立馬舉例說明。正方形的應該是1(記得從0開始計算),橫方塊值是0x80 、豎方塊是0x909、單個方格值是0x96000、空格是0x60000

判斷正方形是否可移動**如下所示。

圖中**已經想象注釋,**只擷取了一部分,分別判斷了是否可以向左、右移動。**中有switchbits函式,該函式是為了交換兩個方格的值,也就是乙個數字的兩個位之間的交換,具體**可以參考源**。當像左移動一時,mcao這個值也會減一。

移動橫方塊方式如下,原理與判斷正方形一致。

這裡的for迴圈是可以取消的,這裡為了方便又多個橫方塊時可以通用,橫刀立馬只有乙個橫方塊,for迴圈只有一次進入if判斷內部。

程式主體框架如下,與上篇文章思路一樣,判斷下一步可以的走法,這裡只是沒有把盤面儲存到線性鍊錶中,用了紅黑樹資料結構去儲存,rbinsert這個函式用來把盤面放入到紅黑樹資料結構中,包括去重判斷。

插入方法如下,根據橫方塊與豎方塊的值作為判斷標準插入到紅黑二叉樹中。

compare函式重構函式如下:

這些知識點看**完全可以看懂,主要是講主體思路

到目前為止程式能夠計算出最佳走法,我們利用棧的先進後出選擇實現走法的順序輸出,**如下:

執行結果如下,本次結果是在qt軟體下執行,耗時相對長一點有50ms左右,linux平台會很快。

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

此為轉貼,原文出處 本系列內容將分成兩大部分 華容道與資料結構 以及 華容道與設計模式 兩者之間會有一些交叉。這個學期給學生上 設計模式 的課程,有些學生提出找些題目練練手,增強一些實戰經驗,我決定讓他們編寫 華容道 遊戲。說實在的,當時並沒有深思熟慮。後來自己仔細想想,發現這裡面東西還真不少,甚至...

華容道解題報告

基本思想 廣度優先遍歷搜尋所有可能棋局。實現方法 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 閱讀建議 新頁面開啟關鍵類圖,...