學習:
1.利用STL裡的next_permutation()函數(對於n個數使用n!下就可以得出它的全排列額:
boolean next_permutation(a.begin(),a.end()) 該函數是以輸入字符串中的字符所構建的按字典順序全排列中,判斷當前字符串之後是否還有下一個字符串 如果next_permutation的執行次數少於全排列的個數,返回true 例如 a="abc" 全排列有 "abc" "acb" "bac" "bca" "cab" "cba" 執行一次next_permutation 返回true a變成 "acb" 再執行一次next_permutation 返回true a變成 "bac" ... 當執行到a="cba" 時 由於這已經是全排列的最後一個字符串,所以 再次執行next_permutation 則返回false
2.首先看什麼叫字典序,顧名思義就是按照字典的順序(a-z, 1-9)。以字典序為基礎,我們可以得出任意兩個數字串的大小。
我的代碼:
#include#include #include using namespace std; int str[4]; //輸入的四位數字。 int shu[10000][4],chu[1000][4],t,h; //t表示shu中元素個數,h表示chu中元素個數。 void painie(void);//對這四個數進行排列並儲存在shu[]中,這裡包含首位為0,和數字重復的情況。 void painie(void) { for(int i=0;i<24;++i)//由於是4!總情況故循環24次 { for(int j=0;j<=3;++j) { shu[t][j]=str[j]; } t++; next_permutation(str,str+4); //每次對str中的四個元素進行排列。 } } int main (void) { int kkk=0; while(scanf("%d%d%d%d",&str[0],&str[1],&str[2],&str[3])&&str[0]+str[1]+str[2]+str[3])//四個同時為零退出。 { if(kkk++) printf("\n");//在每組數據前面輸出一個空行,但第一組數據沒有。 memset(shu,0,sizeof(shu)); memset(chu,0,sizeof(chu)); t=0; h=0; //初始化。 painie(); /*for(int j=0;j
以下為遞歸實現全排列:/*µÝ¹éʵÏÖÈ«ÅÅÁУ¨22:44)*/ #include#include char a[5],b[129][5]; int ht=0;//¼Ç¼bÖÐÊý¾ÝÊýÁ¿¡£ void allsort( char str[],int n,int t); void swap(char str[],int a,int b); void allsort(char str[],int n,int t) { if(ht==0) { for(int i=0;i<5;i++) b[ht][i]=str[i]; ht++; } if(n-t!=1) { for(int k=t;k