【問題描述】
嘗試用遞迴的方法:先輸出所有以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的後一...