免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: nickoal
打印 上一主题 下一主题

[算法] 赛程安排的算法 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-05-09 18:28 |只看该作者

赛程安排的算法

晕,写了一个,有bug。大家帮忙看看

  1.        #include <stdio.h>;
  2. #include <stdlib.h>;
  3. #define SIZE 100
  4. void
  5. resume(char *per,int num)
  6. {
  7.     int i;  

  8.     for(i =0; i < num; i++)
  9.         per[i] = i + 'A';
  10. }

  11. int
  12. main(int argc,char **argv)
  13. {
  14.     int num,i,j,k=0;
  15.     char flag[SIZE][SIZE];
  16.     char per[SIZE];

  17.     num = atoi(argv[1]);
  18.     for(i = 0; i < num ; i++)
  19.         flag[i][i] = -1;
  20.     for(i = 0; i<num; i++)
  21.         per[i] = i + 'A';
  22.     while(k < 2*(num-1)) {
  23.         for(i = 0; i<num ;i++) {
  24.             if (per[i] != -1) {
  25.                 for(j = 0; j <num;j++)
  26.                     if(flag[i][j] != -1 && per[j] != -1) {
  27.                         printf("%c ->; %c\n",per[i],per[j]);   /*i,j are selected*/
  28.                         flag[i][j] = -1;
  29.                         per[i] = per[j] = -1;
  30.                         break;  
  31.                     }      
  32.             }      
  33.         }      
  34.         k++;   
  35.         resume(per,num);
  36.         printf("\n");
  37.     }
  38. }
复制代码

只对2的幂次方球队数正确,如

  1. [root@Danny test]# ./a.out 8
  2. A ->; B
  3. C ->; D
  4. E ->; F
  5. G ->; H

  6. A ->; C
  7. B ->; D
  8. E ->; G
  9. F ->; H

  10. A ->; D
  11. B ->; C
  12. E ->; H
  13. F ->; G

  14. A ->; E
  15. B ->; F
  16. C ->; G
  17. D ->; H

  18. A ->; F
  19. B ->; E
  20. C ->; H
  21. D ->; G

  22. A ->; G
  23. B ->; H
  24. C ->; E
  25. D ->; F

  26. A ->; H
  27. B ->; G
  28. C ->; F
  29. D ->; E

  30. B ->; A
  31. D ->; C
  32. F ->; E
  33. H ->; G

  34. C ->; A
  35. D ->; B
  36. G ->; E
  37. H ->; F

  38. C ->; B
  39. D ->; A
  40. G ->; F
  41. H ->; E

  42. E ->; A
  43. F ->; B
  44. G ->; C
  45. H ->; D

  46. E ->; B
  47. F ->; A
  48. G ->; D
  49. H ->; C

  50. E ->; C
  51. F ->; D
  52. G ->; A
  53. H ->; B

  54. E ->; D
  55. F ->; C
  56. G ->; B
  57. H ->; A
复制代码

对其他的球队数会陷入一种类似死锁的错误,如

  1. [root@Danny test]# ./a.out 6
  2. A ->; B
  3. C ->; D
  4. E ->; F

  5. A ->; C
  6. B ->; D
  7. F ->; E

  8. A ->; D
  9. B ->; C

  10. A ->; E
  11. B ->; F
  12. D ->; C

  13. A ->; F
  14. B ->; E

  15. B ->; A
  16. C ->; E
  17. D ->; F

  18. C ->; A
  19. D ->; B

  20. C ->; B
  21. D ->; A

  22. C ->; F
  23. D ->; E

  24. E ->; A
  25. F ->; B
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
12 [报告]
发表于 2005-05-09 19:13 |只看该作者

赛程安排的算法

to lisp:
因为比赛进行的轮次并不是2*(num-1),而是num*(num-1)/(num/2)次(可以证明这是个整数)
所以
要把k < 2*(num-1))
改为k < num*(num-1)/(num/2)

论坛徽章:
0
13 [报告]
发表于 2005-05-09 20:35 |只看该作者

赛程安排的算法

to yuxh:
2*(num-1),num*(num-1)/(num/2)是相等的吧

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
14 [报告]
发表于 2005-05-10 08:35 |只看该作者

赛程安排的算法

num为奇数时不相等的
另外要保证每轮有num/2场比赛,所以原来的算法是有问题的
一个原则:越少参加比赛的队优先安排,你可以再试试。
这几天比较忙,没时间多想。。。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
15 [报告]
发表于 2005-05-10 11:39 |只看该作者

赛程安排的算法

...

论坛徽章:
0
16 [报告]
发表于 2005-05-10 12:11 |只看该作者

赛程安排的算法

多谢yuxh,你说到的越少参加比赛的队优先安排这个思路只有在奇数个球队下需要考虑吧。但我现在的算法连6,10,12,。。。这些情况都处理不了,只能解决4,8,16,。。。这种2的幂次方的球队数的情况。我今天上午抽时间修改了昨天的算法,想要避免上面类似死锁的状况,结果尝试了几种都不行。我现在只能想到出现死锁后用回朔将其解开。
  刚看到这个题的时候感觉很简单,也很快就写出了上面的代码。但没想到现在居然搞成这样,汗。

论坛徽章:
0
17 [报告]
发表于 2005-05-10 15:19 |只看该作者

赛程安排的算法

main(){
        int n=6;
        int i,j;
        for (i=1;i<=n;i++)
                for (j=i+1;j<=n;j++)
                        printf("%d-%d\n", i, j);
}

论坛徽章:
0
18 [报告]
发表于 2005-05-10 15:29 |只看该作者

赛程安排的算法

原帖由 "narkissos" 发表:
main(){
        int n=6;
        int i,j;
        for (i=1;i<=n;i++)
                for (j=i+1;j<=n;j++)
                        printf("%d-%d\n", i, j);
}

大侠,你这个是用来干什么的?

论坛徽章:
0
19 [报告]
发表于 2005-05-10 15:32 |只看该作者

赛程安排的算法

不好意思,我看错了,不太知道联赛怎么赛,原来是要日程表.

论坛徽章:
0
20 [报告]
发表于 2005-05-10 15:34 |只看该作者

赛程安排的算法

[quote]原帖由 "narkissos"]不好意思,我看错了,不太知道联赛怎么赛,原来是要日程表.[/quote 发表:

是的,就是把整个联赛的赛程排出来
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP