生成可重级排列

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<vector>
#include<sstream>
using namespace std;

const int maxn = 999999;
int P[maxn], A[maxn];
int n;

void print(int n,int *P, int *A,int cur){
   if(cur == n){
      for(int i = 0; i < n; i++)
         printf("%d ",A[i]);
         printf("\n");
         return ;
   }
   for(int i = 0; i < n; i++)
      if(!i||(P[i-1] != P[i])){
       int c1 = 0, c2 = 0;
       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++;
       if(c1 < c2){
          A[cur] = P[i];
          print(n,P,A,cur+1);
       }
     }
}

int main(){

   scanf("%d",&n);
   for(int i = 0; i < n; i++) scanf("%d",&P[i]);
   sort(P,P+n);
   print(n, P, A, 0);
   return 0;
}
简单记忆版
看下面

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<vector>
#include<sstream>
using namespace std;

const int maxn = 999999;
int P[maxn];
int n;



int main(){

   scanf("%d",&n);
   for(int i = 0; i < n; i++) scanf("%d",&P[i]);

   do{
      for(int i = 0;i < n; i++) printf("%d ",P[i]);
      printf("\n");
   }while(next_permutation(P,P+n));

   return 0;
}


猜你喜欢

转载自blog.csdn.net/a874288174/article/details/79894819