N個數的全排列

2021-08-01 03:39:07 字數 1548 閱讀 1388

我採用的方法是類似密碼箱的轉輪來得到所有的排列組合

比如求 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;

以上面的四個作為初始值,在第三位開始輪轉

得到8個新的組合,追加放入最終的容器中

2 3 1 4  //隱含的1 2 3 4組合在第一次已經得到,可以少做一次組合,下面的同理

3 1 2 4

3 4 2 1

4 2 3 1

4 1 3 2

1 3 4 2

1 2 4 3

2 4 1 3

n=2;

以上面的到的12個組合作為種子,開始在第二位置處的輪轉

得到12個新的組合,追加放入最終的容器中

2 1 3 4

3 2 4 1

4 3 1 2

1 4 2 3

3 2 1 4

1 3 2 4

4 3 2 1

2 4 3 1

1 4 3 2

3 1 4 2

2 1 4 3

4 2 1 3

最終得到了所有24個組合

#include#include#define n 4

int arr[4] = ;

int sz=1; //全域性變數,作為每次產生資料的存放位址

int countnum() //統計n個數共有多少的組合

return ret;

}int rock(int**arry,int*str, int pos)

for (j = 0; j < pos-1 ; j++) //開始一次輪換

arry[sz][j] = tmp;

str = arry[sz]; //更新str,開始下一次輪換

sz++;

} return pos;

}int main()

for (i = 0; i < n; i++) //初始化第一項

cup = str[0];

rock(str, cup,n);

int key = 1;

for (i = n - 1; i >1; --i)

len = 0; //len歸零,從頭開始執行j次,第pos位輪轉,

N個數的全排列 回溯法

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

N個數全排列的非遞迴演算法

n個數全排列的非遞迴演算法 include stdio.h voidswap int a,int b 根據當前的排列p,計算下乙個排列。原則是從1234 4321,若p已經是最後乙個排列,傳回false,否則傳回true。p是乙個n維向量。boolnextpermutation int p,intn...

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

參考 陣列中n個數的全排列可以用深度優先搜尋去做 全排列的種數是n 要求按照字典序輸出。這是最典型的深搜問題。我們可以把n個數兩兩建立無向邊 即任意兩個結點之間都有邊,也就是乙個n個結點的完全圖 然後對每個點作為起點,分別做一次深度優先遍歷,當所有點都已經標記時輸出當前的遍歷路徑,就是其中乙個排列,...