有重複全排列
阿新 • • 發佈:2018-12-08
#include<iostream> #include<algorithm> using namespace std; void swap(char& a,char& b) //兩個元素進行交換 { char c = a; a = b; b = c; } bool isSwap(char b[], int start, int i) //i為該元素下標 { for(int k = start; k<i;k++) //判斷在該元素之前有沒有相同元素 if(b[k] == b[i]) return false; //如果有,則返回false return true; } void Perm(char b[],int low,int high,int& n) //核心的演算法啦 { if(low == high) { for(int i = 0;i < low;i++) { printf("%c",b[i]); } n++; printf("\n"); } else { for(int i = low;i < high;i++) { sort(b+low,b+high); if(isSwap(b,low,i)) { swap(b[low],b[i]); Perm(b,low+1,high,n); swap(b[low],b[i]); } } } } int main() { int n = 0; //計數用的 string str; cin>>str; //用字串接收待排元素 char b[9] ; int i = 0; while(str[i]!='\0') { b[i] = str[i]; //把待排元素裝進字元陣列中 i++; } Perm(b,0,str.length(),n); //呼叫Perm進行排序 cout<<n<<endl; //輸出總排列個數 }