您的位置:首页 > 编程语言 > C语言/C++

循环赛程安排

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 比赛安排