回溯演算法在資料結構中是一種常用的演算法,也是一種暴力求解法,基本思想是深度遍歷,選擇一條路一步一步走,當走不通的時候或者已經求得正確的結果,返回上一步,接著選擇另一條路走,直到遍歷完所有節點。
回溯演算法是一種思想,真正用**實現的時候,大多時候都需要用的方法是遞迴。
一. 回溯演算法最出名的是8皇后問題,8皇后問題是在8*8格的棋盤上擺放8個皇后,使得這個8個皇后不在同一行上,也不在不一列上,也不在同乙個對角線上,問有多少種擺法?
這個問題的解法是典型的回溯演算法:
在第一行的某乙個位置放置乙個皇后,當然是從第乙個位置開始。
接著在第二行的找乙個可以擺放皇后的位置,條件就是不在同一行,不在不一列也不在同一斜線上,如果找到則進行下一行的查詢,如果找不到,則回退到第一行的位置重新查詢第乙個皇后的位置,依次類推,直到8個 皇后都放到棋盤上。
**入下:
在這裡插入描述
上面的**最主要的方法是recursionqueen,recursion是遞迴的意思,想象一下8*8的棋盤,引數row為0,從第一行開始,第一行的第乙個位置符合條件,放置乙個皇后,接著遞迴呼叫recursionqueen,row引數為1代表第二行,第二行的第一列檢查不符合條件,因為位於同一列,接著看第二列,同樣不符合條件,接著看看第三列,符合條件,接著在遞迴呼叫recursionqueen,row為2表示第三行,放置第三個皇后,一次類推,直到第八行,第8個皇后符合條件之後,這就找出了第一種正確的擺放位置。
刪除最後乙個皇后,在第8行接著找,直到遍歷完第8行找到全部的擺放位置。第8行遍歷完之後,也就走完了for迴圈,刪除第7行存在列表中皇后,在第七行接著尋找下乙個符條件的皇后,找到之後接著在遞迴呼叫recursionqueen這個方法,尋找第8行符合條件的皇后。等到第7行遍歷完了之後接著刪除第六行的皇后,接著第六行遍歷,尋找第六行下乙個符合條件的皇后,一次類推即可。
以上就是8皇后問題,寫的有點繞,多讀幾遍總能讀懂。
在做幾個回溯問題,鞏固一下:
二. 看下leetcode中的 17. **號碼的字母組合這個問題,問題描述如下:
給定乙個僅包含數字 2-9 的字串,返回所有它能表示的字母組合。
給出數字到字母的對映如下(與**按鍵相同)。注意 1 不對應任何字母。
在這裡插入描述
輸入:"23"
輸出:["ad
回溯法基本思想
回溯法又稱試探法。回溯法的基本做法是深度優先搜尋,是一種組織得井井有條的 能避免不必要重複搜尋的窮舉式搜尋演算法。回溯演算法的基本思想是 從一條路往前走,能進則進,不能進則退回來,換一條路再試。當我們遇到某一類問題時,它的問題可以分解,但是又不能得出明確的動態規劃或是遞迴解法,此時可以考慮用回溯法解...
資料結構之回溯思想
已知樓梯有20階台階,上樓可以一步上1階,也可以一步上2階。請編寫乙個程式,計算總共有多少種不同的上樓梯的方法。include stdio.h define max 20 定義20個台階的樓梯 int steps max steps i 等於1或者2,記錄第i步登上的台階數 int num 0 記錄...
面試問題之資料結構與演算法 遞迴的基本思想
遞迴是演算法設計中的一種基本而重要的演算法。遞迴方法通過函式呼叫自身將問題轉化為本質相同但規模較小的子問題,是分治策略的具體體現。遞規的基本思想是把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解。遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的 量...