7 2 1 生成1 n的排列

2021-09-01 13:32:19 字數 721 閱讀 7044

【問題描述】

嘗試用遞迴的方法:先輸出所有以1開頭的排列,然後輸出以2開頭的排列,…一直到輸出完以9開頭的排列。

【偽**】

void print_permutation(序列 a,集合 s)

); }

}

【**】

由於集合s可以用序列a表示出來–遍歷1-n的所有數,只要a中沒有出現的元素即可使用,因此可以不使用s儲存剩餘元素的集合。由於陣列的大小未知,因此引數應該包括陣列大小n。由於需要確定遞迴的終止條件,也就是將最後乙個元素排列好即可終止,因此還需要傳參cur來確定當前的位置。

void print_permutation(int n,int *a,int cur)

else for (int i = 1;i <= n;i++)

}}

以上**和思路來自書中,由於是最初的教程未引入標記變數vis,因此時間複雜度較高,下面給出更簡單的版本。

使用vis[maxn]來標記使用過的數值,這樣就無需再依次判斷a[0]a[cur-1]了。

【**】

void dfs(int n,int *a,int cur)

else for (int i = 1;i <= n;i++)

}}

生成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的全排列

一 不可重集 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 二 可重集 可重集排列注意如果陣列...

演算法 生成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的後一...