演算法--產生1~n的排列__演算法

來源:互聯網
上載者:User

在暴力求解法中,我們常常要用上枚舉一些簡單內容以便方便獲得解,若要輸出整數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<cstdio>#include <cstdlib>using namespace std;void permutation(int *a,int n,int cur){if(cur==n){for(int i=0;i<n;i++)printf("%d ",a[i]);printf("\n");}else {for(int j=1;j<=n;j++){int ok=1;for(int k=0;k<cur;k++){if(a[k]==j){ok=0;break;}}if(ok){a[cur]=j;permutation(a,n,cur+1);}}}}int main(){int n;scanf("%d",&n);int *a=new int[n]; permutation(a,n,0); }


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.