演算法 生成1 n的排列

2021-06-29 14:26:37 字數 654 閱讀 4748

在暴力求解法中,我們常常要用上列舉一些簡單內容以便方便獲得解,若要輸出整數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的後一位又是按從小到大的順序出現,這似乎有些遞迴的聯絡。

事實上,我們分析一下生成排列的全過程,就會發現有一定遞迴的規律:

這不就是一棵樹嘛?確實,由於這棵樹能展現遞迴函式的呼叫過程,所以也稱之為----解答樹。

現在,根據解答樹我們可以開始構造遞迴函式了:  定義乙個大小等於待排列元素數目的陣列,據解答樹特點,可用dfs方式逐層深入給陣列填空,然後由陣列大小作為遞迴邊界,並且在賦值時注意判斷不可重複。

**如下

#include#include using namespace std;

void permutation(int *a,int n,int cur){

if(cur==n){

for(int i=0;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 二 可重集 可重集排列注意如果陣列...

7 2 1 生成1 n的排列

問題描述 嘗試用遞迴的方法 先輸出所有以1開頭的排列,然後輸出以2開頭的排列,一直到輸出完以9開頭的排列。偽 void print permutation 序列 a,集合 s 由於集合s可以用序列a表示出來 遍歷1 n的所有數,只要a中沒有出現的元素即可使用,因此可以不使用s儲存剩餘元素的集合。由於...