全排列打表

2022-06-01 01:06:11 字數 2506 閱讀 9727

全排列打表原理:

遞迴實現:

假設我們要對1,2,3,4四個數進行全排列,過程如下:

(a)首先保持1不變,對2,3,4全排列;

(b)保持2不變,對3,4全排列;

(c)保持3不變,對4全排列,4的排列只有一種。得到1,2,3,4

(d)然後3不能不變了,繼續保持2不變,3,4互換得到1,2,4,3

(e)以1,2打頭的排列完成,接下來把3換到2的位置,繼續(c)、(d)的操作

...code:

#include#include

#include

#include

using

namespace

std;

/*(1)n個元素的全排列=(n-1個元素的全排列)+(另乙個元素作為字首);

(2)出口:如果遞迴到只有乙個元素的全排列,則說明已經排完,則輸出陣列;

(3)不斷將每個元素放作第乙個元素,然後將這個元素作為字首,並將其餘元素繼續全排列,等到出口,出口出去後還需要還原陣列;

*/const

int maxn = 1e5+10

;int

a[maxn],n;

void dfs(int b,int

k) printf("\n

");return

; }

for(int i=k;i<=n;i++)

}int main()

關於stl中列印全排列表的使用:

有關全排列函式:next_permutation(iterator start,iterator end),和prev_permutation(iterator start,iterator end);

這兩個函式作用是一樣的,區別就在於前者求的是當前排列的下乙個字典序排列,後乙個求的是當前排列的上乙個字典序排列   是否存在。

進行自定義

全排列next_permutation(node,node+n,cmp

next_permutation(num,num+n)函式是對陣列num中的前n個元素進行全排列

#include #include 

using

namespace

std;

intmain()

sort(a,a+n);

dowhile(next_permutation(a,a+n));

}return0;

}

例題:2017第八屆藍橋杯-c++決賽a組 題目1

題目:

隨意組合

小明被綁架到x星球的巫師w那裡。

其時,w正在玩弄兩組資料 (23

58) 和 (146

7)他命令小明從一組資料中分別取數與另一組中的數配對,共配成4對(組中的每個數必被用到)。

小明的配法是:

巫師凝視片刻,突然說這個配法太棒了!

因為:每個配對中的數字組成兩位數,求平方和,無論正倒,居然相等:

87^2 + 56^2 + 34^2 + 21^2 = 12302

78^2 + 65^2 + 43^2 + 12^2 = 12302

小明想了想說:「這有什麼奇怪呢,我們地球人都知道,隨便配配也可以啊!」

86^2 + 54^2 + 31^2 + 27^2 = 12002

68^2 + 45^2 + 13^2 + 72^2 = 12002

巫師頓時凌亂了。。。。。

請你計算一下,包括上邊給出的兩種配法,巫師的兩組資料一共有多少種配對方案具有該特徵。

配對方案計數時,不考慮配對的出現次序。

就是說:

與是同一種方案。

注意:需要提交的是乙個整數,不要填寫任何多餘內容(比如,解釋說明文字等)

view code

思路:

由於給出的兩個序列均只有4個值,所以我們可以全排列列舉匹配所有組成然後判值,如果相等則結果++

#include #include 

#include

using

namespace

std;

int a1[4]=;

int a2[4]=;

int ans=0

;bool

judge()

if(temp1 ==temp2) }//

保證每乙個元素不相同則輸出全排列總個數為n!

void fun(int

x)

//遞迴全排列

for(int i=x; i<4; i++)

}int

main()

view code

46 全排列 全排列 遞迴

遞迴的時候每次確定乙個位置的數字 nums陣列在遞迴過程中分為左右兩部分,左邊部分是已經確定好的部分,而右邊是待確定數字的部分。每次都嘗試用當前位置右邊的數字來交換當前數字以確定當前數字。題目可以使用collections來優化。詳見 class solution 遞迴過程中每次確定乙個位置的數,遞...

46 全排列 47 全排列II

46.全排列 這題和之前做的劍指offer上的字串全排列。一樣。分析 1 如果原始要排列的陣列順序為1 2 3 4,現在只要分別交換1 2,1 3,1 4然後對剩下的3個元素進行遞迴的排列。自己的code 100 class solution if start nums.size 1 return ...

輸出全排列(C 全排列函式)

請編寫程式輸出前n個正整數的全排列 n 10 並通過9個測試用例 即n從1到9 觀察n逐步增大時程式的執行時間。輸入格式 輸入給出正整數n 10 輸出格式 輸出1到n的全排列。每種排列佔一行,數字間無空格。排列的輸出順序為字典序,即序列a 1,a2,an 排在序列b1,b2,bn之前,如果存在k使得...