程序谷2003年7期介紹的華容道游戲,非常好玩,但程序給出的演示走法為85步(給出的單步數是122),現在已知的最快走法為81步。為找到最少步數的走法,編寫了下面的小程序,界面如下:
程序的基本思想是從起點開始依次搜索可能的走法,廣度優先搜索遍歷整個棋譜,直到找到給定節點。為此設置3個表,棋譜表HRD.DB用來記錄走的過程,按No字段建立索引,其中字段QP保存每一步的棋譜,曹操用1和三個0代表;張趙黃馬(豎子)用2和0代表(這樣可以大大減少計算量);關羽(橫子)用3和0代表;兵用4代表;空位用8代表。字段No保存當前節點的位置,千位以上為深度,千位以下為廣度。Prno字段表示該節點的父節點。因為每一譜圖中有兩個空位,而每個空位有4個方向,故一共有8種可能,0為空位1左側子右移,1為空位2左側子右移,2-7分別為向上,向左,向下移動。如果考慮到允許連走,則可能的走法就更多,優化後歸納為16種可能。所以每個父節點可能有多個子節點。計算時是否允許連走由用戶自己選擇。歷史表HRD1.DB是為了優化算法而設,即每走一步棋都要在歷史表中進行查找,當遇到以前出現過的節點時,就不進行處理。結果表HRDJG.DB用來保存找到的結果。
本程序主要是為了說明算法未作任何修飾,程序在Windows98,Delphi6下調試通過,橫刀立馬布局的測試結果在不允許連走時為116步(因為棋子每移動一步計算為一步),在允許連走時為81步。程序中給出了6種布局,都可以得到最少的步數。有興趣的朋友還可以對其他的布局進行測試。當然還可以與本刊2003年7期介紹的華容道游戲程序結合,增加演示功能。