生成1 n的全排列

2021-06-29 06:20:04 字數 1139 閱讀 1150

一、不可重集

#includeusing namespace std;

const int maxn=1000+5;

void print_n(int n,int* a,int cur) //a是儲存全排列的陣列,cur是插入的位置

{ if(cur==n)

{ for(int i=0;i

二、可重集

可重集排列注意如果陣列中有重複的元素,自然不能用上一題的方法,可以數一下目標陣列和輸入陣列的元素值比較一下大小。同時,如果是重複的元素是沒有區別的,所以誰排在前面都是一樣的,因此只有與之前元素不同的元素才能插入。

#include#includeusing namespace std;

const int maxn=1000+5;

int a[maxn],g[maxn];

void print_n(int n,int* g,int* a,int cur)

{ if(cur==n)

{ for(int i=0;i三、

除了這兩種方法還有一種:利用stl中的next_permutation(p,p+n),包含標頭檔案

boolean next_permutation(a.begin(),a.end())

該函式是以輸入字串中的字元所構建的按字典順序全排列中,判斷當前字串之後是否還有下乙個字串

如果next_permutation的執行次數少於全排列的個數,返回true

例如 a="abc" 全排列有 "abc" "acb" "bac" "bca" "cab" "cba"  

執行一次next_permutation 返回true  a變成 "acb"

再執行一次next_permutation 返回true a變成 "bac"

...當執行到a="cba" 時 由於這已經是全排列的最後乙個字串,所以 再次執行next_permutation 則返回false

#include#includeusing namespace std;

int main(){

int n,p[10];

scanf("%d",&n);

for(int i=0;i總結:列舉排列的常用方法就是:遞迴和next_permutation。

生成1 n的排列

摘自 演算法競賽入門經典 按字典序生成1 n的全排列。偽 void print permutation 序列a,集合s if s為空 輸出序列a else 按從小到大的順序依次考慮s的每個元素v print permutation 在a的末尾新增v後得到的新序列,s void print permu...

演算法 生成1 n的排列

在暴力求解法中,我們常常要用上列舉一些簡單內容以便方便獲得解,若要輸出整數n的前n個整數的全排列,則按字典序輸出為 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 從中我們似乎發現了一些規律 先輸出以1開頭的排列,再輸出以2開頭的排列,然後是3 而在以1開頭的排列中,1的後一...

輸出1 n的所有全排列

include define maxn 20 include include using namespace std n個數的全排列等於第乙個位置選x,剩下的位置是n 1個數除去x的全排列,這是遞迴式 遞迴出口最後乙個位置只有乙個可選 用for迴圈實現某個位置上1到n的遍歷 雜湊表記錄某個數當前是否...