# zerojudge e446 排列生成 ## 題目連結 [zerojudge e446](https://zerojudge.tw/ShowProblem?problemid=e446) ### 題目內容 顧名思義,這題就是要你生出1~N所有的排列。 ### 輸入限制 輸出只有一個正整數N。(1<=N<=10) ### 輸出限制 輸出1~N的所有排列,並按照字典序輸出。 ### 解題思路 (1)這題利用回朔(dfs)找出所有的排序,先寫第一層,要設vis[]確認是否已放進陣列,當vis=0時代表沒有使用過,可以放入陣列中,並把當下的vis設為1,接下來dfs(p+1)進入下一層,直到層數等於N值就輸出陣列。 (2)利用next_permutation做全排列 ### 程式碼(1) ```c++ #include<bits/stdc++.h> using namespace std; int n; int a[11]={0}; int vis[11]; void dfs(int p){ if(p>n){ for(int i=1;i<=n;i++){ printf("%d ",a[i]); } printf("\n"); return; } for(int i=1;i<=n;i++){ if(vis[i]==0){ a[p]=i; vis[i]=1; dfs(p+1); vis[i]=0; } } } int main(){ scanf("%d",&n); dfs(1); } ``` ### 程式碼(2) ```c++ #include<bits/stdc++.h> using namespace std; int main(){ int n; while(cin>>n){ int a[n+1]; for(int i=1;i<=n;i++){ a[i]=i; } do{ for(int i=1;i<=n;i++){ printf("%d ",a[i]); } printf("\n"); }while(next_permutation(a+1,a+n+1)); } } ``` ## 測資 ### Sample input 3 ### Sample output 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1