循环赛程安排
2017-11-28 17:41
267 查看
#include "stdio.h" //为参加网球比赛的选手安排比赛日程,设有n(=2k)位选手参加网球循环赛,循环赛共进行n-1天, //每位选手要与其他n-1位选手都赛一场,且每位选手每天赛一场,不轮空。 #define MAXLEN 100 int b[MAXLEN][2];//记录所有比赛场次对手 int j=0;//比赛总场次 //第一步,使用组合算法,求出n个选手,两两之间的组合--即所有的比赛场次。 void function(int n,int r,int a[],int m){ int i; if(r==0){ for(i=0;i<m;i++){ b[j][i]=a[i]; } j++; }else{ for(i=n;i>=r;i--){ a[m]=i; function(i-1,r-1,a,m+1); } } } //b[][]为所有比赛场次,j为比赛总数 ,n为选手个数。 void function2(int b[][2],int j,int n){ int a[j];//记录该场比赛有没有进行过 int v ;//记录该选手这天有没有比赛过 for(int i=0;i<j;i++){//初始化都没比赛过 a[i]=0; if(i<n){ v[i]=0; } } int daytime=n/2;//每天比赛次数 int pre=0; for(int i=1;i<n;i++) {//n-1天比赛 printf("第%d天:\n",i) ; for(int m=0;m<n;m++){ v[m]=0; } for(int k=0,time=0;k<j&&time<daytime;k++) { if(!a[k]){//该场比赛没有进行过 if(v[b[k][0]-1]==0&&v[b[k][1]-1]==0) {//该天这两个选手都还没参加过比赛 time++; a[k]=1; pre=k;//记录当前匹配的场次 v[b[k][0]-1]=time; v[b[k][1]-1]=time; } }else if(k==j-1 && time<daytime){//如果所有场次都遍历完, 还没匹配成功 for(int m=0;m<n;m++){//说明上一组匹配有问题,需要重新从上一组继续匹配。 if(v[m]==time){ v[m]=0; } } a[pre]=0; //重置上一场比赛 time--; k=pre; } } //打印赛程信息 for(int m=1;m<=daytime;m++) { printf("第%d场比赛:",m); for(int k=0;k<n;k++){ if(v[k]==m){ printf("%d号 ",k+1); } } printf("\n"); } printf("\n"); } } int main(){ int a[MAXLEN]; int n; printf("请输入参赛选手数:\n") ; scanf("%d",&n); function(n,2,a,0); // 查看所有的场次 for(int i=0;i<j;i++){ for(int k=0;k<2;k++){ printf("%4d",b[i][k]); } printf("\n"); } //每天场次信息: function2(b,j,n); }
相关文章推荐
- 单循环赛程安排问题
- 循环赛程安排
- 单循环赛程安排问题
- 篮球循环赛:给出循环塞的赛程安排
- 【转】单循环赛赛程安排算法研究
- 【程序8】乒乓球比赛赛程安排
- 赛程安排问题
- 分治算法求解赛程安排
- (精)hdoj 2309(贪心算法)(开始的时候我还怀疑是不是要多次循环安排,后来我发现第一次的最多)
- 乒乓球比赛赛程安排
- cocos2d-x游戏循环和日程安排
- UESTC 1607 大学生足球联赛 构造、蛇形安排赛程表
- 分治算法之赛程安排问题
- 赛程安排
- 多人单循环比赛的安排问题
- 【模拟退火】【NOI2008】赛程安排
- 赛程安排问题
- 赛程安排--基于多边形思想
- 比赛赛程安排算法--分治算法
- 分治算法-选手赛程安排