我們假如有一串式子,排列組合的結果會有很多種,全排列就是按照字典序有序的將所有的排列組合的性質的陳列出來
問題可以這麼描述:
對於給定的集合a,其中的n個元素互不相同,如何輸出這n個元素的所有排列(全排列)
我們來這麼看這個問題,加入有n個資料要進行全排列,我們可以假想我們面前有n個盒子
每一次我們有大小順序的依次將我們手頭還空餘的數放進盒子中,當我們手頭已經空的時候,我們就已經生成了一種全排列
這個時候我們採用深搜(回溯法)的思想,我們收起我們剛才放入盒子的元素,然後放進去下乙個恰好(一定要是恰好,中間不可以在空餘出滿足條件的元素)比他大的元素,然後繼續這個過程,當我們所有的情況都結束之後,那麼我們的全排列也就生成完畢了
dfs**如下 :
#include"iostream"
#include"cstdio"
#include"cstdlib"
#include"cstring"
using namespace std;
//假設問題是求出1-5的全排列
int a[6];
bool book[6]; //用來複製記錄哪些我們已經用過了
void dfs(int n) //n代表目前該操作哪個盒子
, 是按照從大到小進行排列的。即有 pj+1 > pj+2 > ... > pn, 因為 j=max
} }
void swap(int x,int y)
void change()
} return 0; //找不到對應的j的位置,說明全排列已經全部輸出
}void swap(int x,int y)
void change()
}int main()
else break;
} return 0;
}
全排列生成演算法
recursive generating 這個演算法接受乙個元素均不同的陣列,通過遞迴的呼叫以生成所有全排列序列。遞迴的原則在於,生成序列的全排列p a1,a2,an 等價於生成序列 這構成了遞迴演算法設計的deduction case 而base case,則是要生成全排列的序列只有乙個元素。整個...
全排列生成演算法
問題 生成1 n的全排列 生成乙個陣列中所有元素的全排列 思想 依據字典序順序,由前乙個排列,生成後乙個排列。字典序方法 輸入前乙個排列,輸出後乙個排列 vector nextpermutation vector p 主呼叫方法 void generatepermutation int n for ...
全排列生成演算法 next permutation
全排列的生成演算法有很多種,有遞迴遍例,也有迴圈移位法等等。c stl中定義的next permutation和prev permutation函式則是非常靈活且高效的一種方法,它被廣泛的應用於為指定序列生成不同的排列。本文將詳細的介紹prev permutation函式的內部演算法。按照stl文件...