最簡回溯法求全排列 遞迴形式 快速領悟回溯法竅門

2021-08-10 20:16:38 字數 774 閱讀 5794

思路:比如123,在第乙個位置擺放的時候,有3種情況,用乙個for迴圈,第一次找的是1,1就被標記了,在找第二位第三位的時候,1就不可以用了。

再找第二位,剩下2和3,由於1被標記了,只可以找2或者3,先取的是2,取後標記2。

再找第三位,剩下了3,由於12都被標記了,只可以找3,所以直接就是3。

第乙個序列123就出來了。由於3只有一種情況,他一次就執行完了。

看到第二位,剩下2和3,2取過了,現在取3,所以最後一位只能取2了。

這樣最後兩位的變化都已經搞完了。

第一位又可以做文章了。1取過了,這裡就取到了2。那相應的,第二位和第三位也就剩下了1和3,也是一樣的操作原理。

最後第一位取3,思路十分簡單,**同樣也不難。

private void 

sort(int level) else

flag[i] = false;

//最後一層搞完後,恢復這一層,讓剩下那個數再搞

} }

}

其實也可以這樣理解:巨集觀來講:這個方法的功能也就是從當前位開始到最後,找到所有可能排列的情況。

微觀來講:其實就是從for迴圈中找出未標記過的乙個數,把他標記了,再把剩下未標記的數去遞迴,交給子方法去做。如果都選完了,那麼輸出就可以了。

還有乙個問題,他是怎麼回溯的?其實你for迴圈其實裡面有一重又一重的for迴圈(因為你採用了遞迴),等你最裡面那一層執行完了,自然會執行上一層的東西,所以他是會自動回溯的,你只需要考慮的是,回溯以後,本來被你標記的東西,重新變為未標記狀態即可。

遞迴求全排列

取出陣列中第乙個元素放到最後,即a 1 與a n 交換,然後遞迴求a n 1 的全排列 1 如果陣列只有乙個元素n 1,a 則全排列就是 2 如果陣列有兩個元素n 2,a 則全排列是 a 1 與a 2 交換。交換後求a 2 1 的全排列,歸結到1 a 2 與a 2 交換。交換後求a 2 1 的全排列...

回溯法 全排列

有重複數字的全排列 元素奇偶相間的排列 給定乙個沒有重複數字的序列,返回其所有可能的全排列。輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 利用 回溯法排列樹模板 沒有限定條件即就是沒有衝突。class solution def permute sel...

自寫 求全排列 新演算法 遞迴實現

演算法思想從根本上區別於網 上的諸多方法,思想基於把用來儲存一組數形成的所有序列的二維陣列看成乙個表 每個排列都是豎著放的,看著順眼 而使用遞迴進行了類似於把表從上到下一行一行的填滿,有幾個數就有幾層遞迴 每層有多個遞迴 這次關鍵乙個遞迴函式 只有30左右行 但從構思到寫 到除錯完成,花了將近一天半...