求陣列中任意n個數的全排列

2021-07-23 07:54:08 字數 522 閱讀 4206

參考

陣列中n個數的全排列可以用深度優先搜尋去做

全排列的種數是n!,要求按照字典序輸出。這是最典型的深搜問題。我們可以把n個數兩兩建立無向邊(即任意兩個結點之間都有邊,也就是乙個n個結點的完全圖),然後對每個點作為起點,分別做一次深度優先遍歷,當所有點都已經標記時輸出當前的遍歷路徑,就是其中乙個排列,這裡需要注意,回溯的時候需要將原先標記的點的標記取消,否則只能輸出乙個排列。如果要按照字典序,則需要在遍歷的時候保證每次遍歷都是按照結點從小到大的方式進行遍歷的。

#include#includeusing namespace std;

#define max 20

vectorindex;

int visited[max]=;

void dfs(int arr,int len,int num,int k)//len代表陣列長度,num表示當前求到第幾個,k表示多少數的全排列

{ if(k==num){

for(int i=0;i

N個數的全排列

我採用的方法是類似密碼箱的轉輪來得到所有的排列組合 比如求 1,2,3,4的所有排列組合 採用遞減式輪轉來生成 n 4 以1234為初始值 得到如下的所有4個組合,放入最終的容器中 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3 n 3 以上面的四個作為初始值,在第三位開始輪轉 得到...

求陣列的全部子集 全排列

原文 write a method that returns all subsets of a set.譯文 寫乙個函式返回乙個集合中的所有子集。對於乙個集合,它的子集一共有2n 個 包括空集和它本身 它的任何乙個子集,我們都可以理解為這個集合本身的每個元素是否出現而形成的乙個序列。比如說,對於集合...

N個數的全排列 回溯法

思路 問題的解空間為排列樹,乙個排列中元素不能重複,故採用交換的方式,對於排列樹的第i層,擴充套件狀態是a i 可以取a i 到a n 1 的任何元素,即j i到n 1迴圈 將a i 與a j 交換,在這種方式下求出排列後需要恢復,即將a i 與a j 再次交換,回到之前的狀態 回溯 然後繼續求其他...