1. 程式人生 > >算法入門經典-第七章 例題7-2-2 可重集的排列

算法入門經典-第七章 例題7-2-2 可重集的排列

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 可重集的排列