劍指offer(四):回溯篇(python)

借用百度百科中的話:回溯算法實際上一個類似枚舉的搜索嘗試過程,主要是在搜索嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。回溯法是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術爲回溯法,而滿足回溯條件的某個狀態的點稱爲“回溯點”。

回溯算法是一種常用的算法,聽上去它跟深度優先遍歷非常相似,那麼這二者有什麼區別呢,這個問題不是這篇文章總結的內容,有興趣的同學可以查看參考文獻中的相關鏈接。那麼本篇文章主要是總結劍指offer中和回溯相關的題目。

1. 劍指offer第12題:矩陣中的路徑

這道題的題目描述和代碼實現見下圖:

     

這道題目的解題思路寫的比較清晰,此處不再贅述。

2. 劍指offer第13題:機器人的運動範圍

這道題的題目描述和代碼實現見下圖:

     

這道題的解題思路比較清晰,不再進行贅述。

3. 劍指offer第38+題:八皇后問題

劍指offer中的第38題是求字符串的排列問題,在其相關題目上列出了八皇后問題,但是八皇后問題回溯算法的典型應用,因爲把它放到了回溯算法這一專題更爲合適,這道題的題目描述和代碼實現如下:

      

從上面的代碼中可以看到,res的shape是(92,8),這就說明八皇后問題有92個解,8是指每個解的行數。但是92個解中有些解的經過旋轉90度,旋轉180度或者經過對稱後會得到另一個解,所以我們可以認爲這92個解中有很多解是重複的,8皇后問題有12個獨立解,如下(下圖來自維基百科):

            

有關放置皇后位置的圖解如下:

                                       

其中對角線上不能有兩個皇后、同一列不能有兩個皇后。 

參考文獻:

1. 回溯算法和深度優先遍歷的異同       https://www.cnblogs.com/ganganloveu/p/4188131.htm

2. 八皇后問題     https://zh.wikipedia.org/wiki/%E5%85%AB%E7%9A%87%E5%90%8E%E9%97%AE%E9%A2%98

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章