CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

一个排列组合的算法问题,答出就给分

楼主tfe(tfe)2006-07-04 13:52:18 在 VC/MFC / 图形处理/算法 提问

要求1-49,这49个数组合。  
  10个数为一组。  
  同组不可有重复的数。就是说,不可以1,2,3,4,5,6,7,8,9,9.  
  任意两组数要求至少有三个数不同。  
  排出所有数组。    
  问题点数:100、回复次数:10Top

1 楼thisisll(学习王高李,有个好身体)回复于 2006-07-04 17:33:03 得分 10

如果没有这句话  
  任意两组数要求至少有三个数不同。  
   
  10个循环  
  然后最里面的一个一个的换  
   
  现在有这句话了  
  10个循环  
  最里面3个for一起换  
  for(1->49)  
      for(1->49)  
          for(1->49)  
  ...碰到重复的跳过  
              for(1->49)  
              for(1->49)  
              for(1->49)这3个平行的Top

2 楼jxegong()回复于 2006-07-04 18:05:01 得分 10

这题目很有趣,想了很久没想出好办法来,做个标记先,慢慢想。  
  一楼的思路我不是很清楚,但我感觉不是个好办法。  
  即使用个十位的栈,并保证从栈底到栈顶数字由小到大排列的话,穷举所需的循环次数也只是  
  10个for循环的1/(10!)Top

3 楼jxegong()回复于 2006-07-04 18:29:55 得分 0

另外我觉得这个题目还有个这样的问题,那就是结果并不唯一。比如先选定第一组数{1,2,3,4,5,6,7,8,9,10},那么第二组数该如何选。显然选{1,2,3,4,5,6,7,11,12,13}和选{1,2,3,4,5,6,7,11,12,14}将会导致最后得到的数组集合不同。甚至第二组数不同的两个选择将可能导致最后得到的两个集合的个数可能也不同。  
  晕了。Top

4 楼tfe(tfe)回复于 2006-07-05 15:06:21 得分 0

我用vb跑一楼的程序已经跑死机了。而且我的循环是这样的  
  for(49->1)  
      for(48->1)  
          for(47->1)  
  Top

5 楼livedeal(怀念)回复于 2006-07-05 17:18:49 得分 0

呵呵`~`Top

6 楼laiyiling(陌生人[MVP])回复于 2006-07-06 13:29:43 得分 10

参考上面的算法,这个算法需要你根据上面的两个附加条件,列举判断  
  http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=186476Top

7 楼yzhg_cgl(Little Fish)回复于 2006-08-02 16:31:32 得分 10

3                 7  
  C           *     C  
      49               46  
  到于怎么实现,请参考我在C里发表的相关回复.  
  Top

8 楼wj8215()回复于 2006-08-03 15:27:07 得分 0

用10个for按从小到大写出全部的组合,其中把倒数第三个数进行一个3的跳变,每次运行到最后就跳到倒数第三个数那里加3,然后再循环,这样就可以得到了!!!  
  我用JAVA写了这个小程序,不知道楼主要不要代码呢?Top

9 楼wj8215()回复于 2006-08-03 15:45:10 得分 0

不好意思,还想漏了一点东西Top

10 楼wj8215()回复于 2006-08-04 09:38:23 得分 60

用10个for按从小到大写出全部的组合,其中把倒数第三个数进行一个3的跳变,也就是做一个3个数的移位,当最后一个数是49时,跳到顺数第五个数,让这个数也做3的跳变,当第七个数是46时,跳到第一位,让第一位做一个4的跳变,这样做应该就可以了。组合数是408  
  下面是我用JAVA做的程序,可以参考一下:  
  double   y=1;  
  Loop3:for(int   a=1;   a<=49;   a=a+4){  
  for(int   b=2;   b<=49;   b++){  
  if(b>a){  
  for(int   c=3;   c<=49;   c++){  
  if(c>b){  
  for(int   d=4;   d<=49;   d++){  
  if(d>c){  
  Loop2:for(int   e=5;   e<=49;   e=e+3){  
  if(e>d){  
  for(int   f=6;   f<=49;   f++){  
  if(f>e){  
  for(int   g=7;   g<=49;   g++){  
  if(g>f){  
  Loop1:for(int   h=8;   h<=49;   h=h+3){  
  if(h>g){  
  for(int   i=9;   i<=49;   i++){  
  if(i>h){  
  for(int   j=10;   j<=49;   j++){  
  if(j>i){  
  System.out.println(a+",   "+b+",   "+c+",   "+d+",   "+e+",   "+f+",   "+g+",   "+h+",   "+i+",   "+j+":   "+y);  
  y++;  
  if(g==46)   continue   Loop3;  
  if(j==49)   continue   Loop2;  
  continue   Loop1;  
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:tfe
  • thisisll
  • jxegong
  • laiyiling
  • yzhg_cgl
  • wj8215

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo