我採用的方法是類似密碼箱的轉輪來得到所有的排列組合
比如求 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個結點的完全圖 然後對每個點作為起點,分別做一次深度優先遍歷,當所有點都已經標記時輸出當前的遍歷路徑,就是其中乙個排列,...