算法入門經典-第七章 例題7-2-2 可重集的排列
阿新 • • 發佈:2017-09-04
int ati ret oid blog 入門經典 for class scan
可重:如果問題變成輸入數組p,並按字典序輸出數組A個元素的所有全排列,則需要修改代碼集的全排列
// Rujia Liu #include<cstdio> #include<algorithm> using namespace std; int P[100], A[100]; // 輸出數組P中元素的全排列。數組P中可能有重復元素 void print_permutation(int n, int* P, int* A, int cur) { if(cur == n) { for(int i = 0; i < n; i++) printf("%d ", A[i]); printf("\n");
//printf("cur=%d\n",cur); } else for(int i = 0; i < n; i++) //p[i] == p[i-1]的話,那麽p[i]這個數只考慮p[i-1]的就行 //i == 0 時 那麽必定要取 因為沒有比它更前的可以考慮 if(!i || P[i] != P[i-1]) { int c1 = 0, c2 = 0; //A是已經填進去的, P是還沒有填的 //用c1 c2統計已經填進去的個數和全部, 如果c1 < c2說明有沒填進去的 for(int j = 0; j < cur; j++) if(A[j] == P[i]) c1++; for(int j = 0; j < n; j++) if(P[i] == P[j]) c2++; // printf("i=%d cur=%d c1=%d c2=%d\n", i, cur,c1,c2); if(c1 < c2) { A[cur] = P[i]; print_permutation(n, P, A, cur+1); } } } int main() {int i, n; scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d", &P[i]); sort(P, P+n); print_permutation(n, P, A, 0); return 0; }
測試
算法入門經典-第七章 例題7-2-2 可重集的排列