掌握回溯法設計思想。
掌握消消樂問題的回溯法解法。
《開心消消樂》是一款樂元素研發的三消類休閒遊戲。遊戲中消除的物件為小動物的頭像,包括小浣熊、小狐狸、小青蛙和小雞等動物頭像。玩家通過移動動物頭像位置湊夠同行/同列3個或3個以上即可消除。
消除塊:就是對這個塊劃十字(下圖情況為舉例,實際上不會有這種情況)。
向下塌陷:消除時記錄下最左、最右、最下邊消除的塊。從最下往上、從最左往最右遍歷,如果(x, y)處沒有塊,向上找到第乙個塊交換。塌陷後檢查塌下來的塊有無可以被消除的,迴圈。
檢查:檢查同樣只要檢查最左到最右、最下到頂這麼一小塊,因為只有這個範圍內的塌陷了,要有能繼續消的也在這個範圍。
交換兩塊:交換兩塊,然後嘗試消去(兩塊都嘗試),如果能消去就塌陷、檢查。
回溯沒啥好說的,把樹畫出來一看就明白了。
存下遍歷過的每一張圖
用map存下《圖, 分》對,對當前的圖,拿出map中對應圖,若當前得分小於map中訪問的分,剪枝;否則更新分值。
注意這種方法可能不能得到最優解,準確率在99%左右(請自己測一下),原因如下:
如果經過x步到達了第n個地圖狀態,且此時為該狀態最大分數scorex,更新了map[n] = scorex。但是或許會存在當某一次到達n狀態時,其分數scorey < scorex,但步數y < x,在有步數限制的情況下,未來將有機會在分數上超過前者。
概率剪枝
對m*n的隨機棋盤做多次無剪枝回溯,得到k步得分平均資料。則在當前棋盤,若最大得分為p,步數限制為maxstep,當前第k步已得q分,如果q + (maxstep步平均分- 當前步數平均分) < p,剪掉。
為提公升準確率,剪枝條件改為q + (maxstep步平均分 -當前步數平均分) < w * p。可見w越小準確率越高,但速度會變慢。
這種剪枝當然也會有概率不能得到最優解,準確率視w而不同(請自測)。
演算法實驗 回溯法求解0 1揹包問題
通過剪枝和衝突,走遍所有可能的選擇,最終得到最優解 1 每個節點有兩種選擇方法,依次對所有可能的方法進行遍歷 2 在遍歷的過程中通過設定一全域性變數用來比較所有的解法的結果,最終得到最優解 lagestv 0bestx 1 2 def jianzhi i,n,c,w,ww if i n return...
回溯法 求解皇后問題
include include using namespace std static char queen 8 8 建立乙個棋盤 static int a 8 static int b 15 static int c 15 static int iqueennum 0 記錄總的棋盤狀態數 voidq...
回溯法求解迷宮問題
題目 這是我在老師發的ppt上發現的一道題,如下 1表示起點 7表示終點,一共六個路口,每個路口可以通達最多左上右三個路口,不能走的方向用0表示,求從1到7的路徑。求解思路 每個路口最多有三個搜尋分支。把演算法設計為如下的搜尋過程 把整個搜尋分解為向左 向前和向右三個方向上子問題的搜尋。當搜尋到某個...