码迷,mamicode.com
首页 > 编程语言 > 详细

算法入门经典-第七章 例题7-2-2 可重集的排列

时间:2017-09-04 22:40:09      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:oid   http   alt   scan   个数   names   print   code   blog   

 

 

可重:如果问题变成输入数组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 可重集的排列

标签:oid   http   alt   scan   个数   names   print   code   blog   

原文地址:http://www.cnblogs.com/is-Tina/p/7475951.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!