- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 40150
- 在线时间
- 小时
|
发表于 2010-8-19 17:17:49
|
显示全部楼层
他没有检查两边id中使用了重复数据的情况,稍微修改即可:-
- /**************************************************************************
- * ..:.....
- * ......聯CLOVER聰.
- * .....聯CROCUS聰.
- * .....聯VIOLET聰.
- * ...................
- * .....................
- * .................0.9....
- * http://bbs.emath.ac.cn/viewthread.php?tid=2606&extra=&page=1
- * ..:
- * ........X,Y,Z,....10............:
- * -99900*V+10*U-T+S+10001*R+1000*O+9900*L-10000*I+200100*C==0
- * ....:
- * -99900*V+10*U-T+S+10001*R == -1000*O-9900*L+10000*I-200100*C
- * ..................left.right,.....
- * ..............................
- * .........,.....: 10^5+10^4
- *************************************************************************/
- #include <stdlib.h>
- #include <stdio.h>
-
- typedef struct {int value,id;} group;//value.......,id........................
- int cmp(const void *a, const void *b){return ((group *)a)->value - ((group *)b)->value;}//......
- int testid(int id1, int id2)
- {
- char b[10];
- int i;
- for(i=0;i<10;i++)b[i]=0;
- for(i=0;i<5;i++){
- b[id1%10]++;
- id1/=10;
- }
- for(i=0;i<4;i++){
- b[id2%10]++;
- id2/=10;
- }
- for(i=0;i<10;i++)if(b[i]>1)return 0;
- return 1;
- }
-
- int main()
- {
- int o,l,i,c,r;//.....vutsr.olic.....5.
- group left[100000],*pl=left,right[10000],*pr=right;
- for(o=0;o<10;o++)for(l=0;l<10;l++)for(i=0;i<10;i++)for(c=0;c<10;c++)
- {
- pr->value=-1000*o-9900*l+10000*i-200100*c;
- pr->id=1000*o+100*l+10*i+c;
- pr++;
- for(r=0;r<10;r++)
- {
- pl->value=-99900*o+10*l-i+c+10001*r;
- pl->id=o*10000+l*1000+i*100+c*10+r;
- pl++;
- }
- }
-
- qsort(left, 100000, sizeof(group), cmp);
- qsort(right, 10000, sizeof(group), cmp);
-
- printf("%d,%d\n",left[0].value,right[0].value);
- printf("vutsr,olic\n----------\n");
- for(pl--,pr--;pl!=left&&pr!=right;)
- {
- if(pl->value==pr->value)
- {
- //......,........X,Y,Z..........
- if(testid(pl->id,pr->id))
- printf("%05d,%04d\n",pl->id,pr->id);
- while((pl-1)->value==pl->value){
- pl--;
- if(testid(pl->id,pr->id))
- printf("%05d,%04d\n",pl->id,pr->id);
- }
- while((pr-1)->value==pr->value){
- pr--;
- if(testid(pl->id,pr->id))
- printf("%05d,%04d\n",pl->id,pr->id);
- }
- pl--,pr--;
- }
- if(pl->value > pr->value)pl--;else pr--;
- }
-
- return 0;
- }
复制代码 输出:
-899109,-1899000
vutsr,olic
----------
59376,0842 |
|