全排列總結

2021-09-13 02:07:01 字數 1372 閱讀 1701

馬上藍橋杯省賽了… 菜雞又是去當分母的…

把一些基礎的演算法都總結一下,當作複習了

首先最簡單的是用stl中的next_permutation和prev_permutation了

next_permutation(start,end) 是輸出下乙個排列,所以用之前要對陣列進行從小到大排序

void

perm

(int

* a,

int n)

while

(next_permutation

( a +

1, a + n +1)

);//下乙個排列

}

prev_permutation需要從大到小排序,並且是逆著輸出全排列

bool cmp

(const

int a,

const

int b)

void

perm

(int

* a,

int n)

while

(prev_permutation

( a+

1, a + n +1)

);//下乙個排列

}

下面說說如何手寫實現全排列

先是簡單的回溯法生成,但是不是字典序,每次交換相鄰的兩個值就好了。

void

perm

(int

* a,

int cur,

int n)

cout<}else

for(

int j=cur;j)}

然後是字典序的全排列

void

perm

(int

* a,

int cur ,

int n)

cout<}else

for(

int i=

1;i<=n;i++)if

(!ok)

}}

單個搜尋給陣列填數就好了。也比較簡單。

顯然,上面的演算法就決定了這種方式無法輸出有重複元素的全排列,因為我們選擇了沒有出現過元素。

我們只要改進演算法,計算該元素的個數以及之前使用過的個數進行比較,如果不相等就可以使用

void

perm

(int

* a,

int cur ,

int n)

cout<}else

for(

int i=

0;i(!i||p[i]

!=p[i-1]

)}}

全排列總結

若給你一堆數,讓你輸出他的全排列,可以有以下方式實現,不過各有優點和缺點 1.深度優先搜尋 included include include includeusing namespace std int n int book 100 int ch 100 int kong 100 void dfs ...

全排列總結

接觸全排列已經好長時間了,一直沒有抽空總結一下全排列的相關問題,下面來說一下!一般地,從n個不同元素中取出m m n 個元素,按照一定的順序排成一列,叫做從n個元素中取出m個元素的乙個排列 arrangement 特別地,當m n時,這個排列被稱作全排列 permutation 特別,當n m時為全...

全排列演算法總結

本文同時發布在我的個人部落格 求 n 位的字串的全排列,先確定第 0 位,然後對後面 n 1 位進行全排列,在對 n 1 為進行全排列時,先確定第 1 位,然後對後面的 n 2 位進行全排列.由此得到遞迴函式和遞迴的結束條件。全排列也就是交換位置,到 n 2 位時,就是將 n 2 和 n 1 交換位...