【 OJ 】 HDOJ1027 18年11月12日20:16 [ 26 ]
阿新 • • 發佈:2018-12-02
因為本題的題意為,給定一串序列,指定輸出第M個全排序序列
所以本題網上解題的基本上都是用的STL的全排列演算法next_permutation,簡單粗暴可以直接AC
具體思想可以參考《STL原始碼剖析》
本來想直接使用next_permutation來直接AC這題,後來還是寫了一下,和原始碼基本差不多.....ummm屬於盜版吧
本題已經AC
# include<iostream> using namespace std; int a[1002]; void swap(int &a, int &b) { int t; t = a; a = b; b = t; } bool next_permutation_(int*a, int N) { if (N < 2) return false; int i, ii, j;// i ii j 三個指標 i = N - 1; for (;;) { ii = i--; if (i>=0&&a[i] < a[ii]) { j = N; while (a[--j] <= a[i]);//不需要加限制條件 ii 肯定大於 swap(a[i], a[j]);//交換 i j reverse(a+ii,a+N);//ii 之後全部翻轉 return true; } if(i<0) return false; } } int main(void) { int N, M;// N個數 第M個全排列序列 while (cin >> N >> M) { for (int i = 0; i < N; ++i) { a[i] = i + 1; }//錄入資料 for (int i = 1; i < M; ++i) { next_permutation_(a, N); } cout << a[0]; for (int i = 1; i < N; ++i) { cout << " " << a[i]; } cout << endl; } system("pause"); return 0; }
下面有一個全排列的遞迴(非字典排序)感覺不錯,看別人寫的,自己寫了一下儲存防止忘記
此程式碼是在網頁中寫的,可能會有細節錯誤,但是應該沒太大問題.....ummm沒有用編譯器檢查
# include<iostream> using namespace std; int a[100]; void swap(int a,int b){ int t; t=a; a=b; b=t; } void permutation(int*a,int N,int index){ if(index==N){ for(int i=0;i<N;i++){ cout<<a[i]<<" "; } cout<<endl; } for(int i=0;i<N;i++){ swap(a[i],a[index]); permutation(a,N,index+1); swap(a[i],a[index]); } } int main(void){ int N; cin>>N; for(int i=0;i<N;++i){ a[i]=i+1; }//錄入陣列 permutation(a,N,0);//遞迴中會輸出所有全排列 system("pause"); return 0; }