算法竞赛入门经典:第七章 暴力求解法 7.6可重复的排列
2015-08-18 09:18
323 查看
/* 生成可重集得到排列: 把问题改成:输入数组P,并按字典序输出数组A各元素的所有全排列,则需要对上述程序进行修改--把P加到printPermutation的参数列表中,然后把 代码中的if(iArr[i] == j) 和if(A[pos] == j)改成if(iArr[i] == P[j]) 和 iArr[pos] = P[j] bug1:如果数组中是重复的元素 1 1 1的话 ,因为禁止出现重复,造成错误 解决方法:统计iArr[0]~iArr[pos-1]中P[i]的出现次数c1,以及P数组中P[i]出现的次数c2。只要c1<c2,就可以递归 bug2:如果111重复,也输出27次。枚举的下标应该不重复,不遗漏取遍所有p[i]值。只需检查p的第一个元素和所有前一个元素不相同。 思路: */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 1024 void printPermutation(int* iArr,int pos,int n,int* iPer) { if(pos == n) { for(int k = 0 ; k < n;k++) { printf("%d ",iArr[k]); } printf("\n"); return; } for(int i = 0;i < n;i++) { if(!i || iPer[i] != iPer[i-1])//判断当前元素与前面元素不能重复,否则遇111这种数组,会有重复输出 { //统计iArr[0]到iArr[pos-1]中iPer[i]出现的次数 int iCount1 = 0; for(int j = 0; j < pos;j++) { if(iArr[j] == iPer[i]) { iCount1++; } } int iCount = 0; //统计iPer[i]在数组中出现次数 for(int m = 0; m < n ;m++) { if(iPer[i] == iPer[m]) { iCount++; } } //if(!isAppear) if(iCount1 < iCount)//判断重复的条件应该改成出现次数的判断 { iArr[pos] = iPer[i];//把第iPos个元素确定下来之后进行后续递归 printPermutation(iArr,pos+1,n,iPer); } } } } int main(int argc,char* argv[]) { int n; while(EOF != scanf("%d",&n)) { int iArr[MAXSIZE]; int iPer[MAXSIZE]; int j = 0; for(int i = 0; i < n;i++) { scanf("%d",&iPer[j++]); } printPermutation(iArr,0,n,iPer); } system("pause"); return 0; }
相关文章推荐
- 串口之OVERLAPPED结构体详解
- Sharepoint 2013 开启App和配置App
- leetcode-Single Number III 找独数
- windows,打印机无打印任务,仍不断打印
- HDOJ 2647 Reward (反向拓扑排序)
- UVA101积木模拟问题,vector整体擦除和整体插入的使用
- C#实现阿拉伯数字到大写中文的转换
- (精)前后端分离的思考与实践(二)
- scikit-learn:matplotlib.pyplot常用画图功能总结(1)
- Android APK反编译就这么简单 详解(附图)
- Java实现文件上传
- 华为机试练习150817第一题:名字的漂亮度
- nginx搭建tcp代理服务器
- leetcode 150 —— Evaluate Reverse Polish Notation
- Scala实战-通过微信聊天窗口实现应答式点餐 0
- (精)前后端分离的思考与实践(一)
- POJ - 2532 Stars
- mysql新建用户及授权
- awk length
- B. Vanya and Books( Codeforces Round #308 (Div. 2) 简单题)