遞迴輸出全排列
阿新 • • 發佈:2019-02-04
題目:輸出1-8的全排列。
思路:遞迴,已取數(放首位)+剩餘數(繼續全排列)。對於1-3的全排列進行分析:第一位放1,再對兩位2,3進行全排列。第一位放2,再對1,3全排列……
其它思路:STL中有next_permutation(首位置,末位置)函式,求固定區間內數的下一個全排列。實現原理(之前寫過部落格,可惜用到的時候想不起來,所以就當瞭解好了):對於1,2,3,5,4要尋找當前序列的下一個排列,從後向前尋找逆序列,即5,4,再對前一個數進行3操作,將3,4對換,變成1,2,4,5,3,再將逆序部分正序即可,即1,2,4,3,5。
詳細連結:http://blog.csdn.net/mungbeanwithredface/article/details/77995593
全排列和逆序數:突然想起一個知識點補充一下吧。對於一個排列,逆序數為奇數則為奇排列,為偶數則為偶排列。任意兩個位置對換,會改變排列的奇偶性。連結:https://wenku.baidu.com/view/50a4737e102de2bd97058826.html
ac程式碼1:
#include<bits/stdc++.h> using namespace std; int a[]={1,2,3,4,5,6,7,8}; void print(int s,int e){ if(s==e){ for(int i=0;i<e;i++) printf("%d%c",a[i],i==e-1?'\n':' '); return; } for(int i=s;i<e;i++){ for(int j=i;j>=s+1;j--) swap(a[j],a[j-1]); print(s+1,e); for(int j=s;j<=i-1;j++) swap(a[j+1],a[j]); } } int main(){ print(0,8); return 0; }
ac程式碼2:
#include<iostream> #include<cstring> #include<string> #include<algorithm> using namespace std; int main(){ int a[]={1,2,3,4,5,6,7,8}; do{ for(int i=0;i<7;i++){ printf("%d ",a[i]); } printf("%d\n",a[7]); }while(next_permutation(a,a+8)); return 0; }