循环赛程安排

来源:互联网 发布:攻击战斗机2优化 编辑:程序博客网 时间:2024/04/27 16:09
#include "stdio.h" //为参加网球比赛的选手安排比赛日程,设有n(=2k)位选手参加网球循环赛,循环赛共进行n-1天,//每位选手要与其他n-1位选手都赛一场,且每位选手每天赛一场,不轮空。#define MAXLEN 100int 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[n];//记录该选手这天有没有比赛过 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);}

原创粉丝点击