循环赛程安排
来源:互联网 发布:攻击战斗机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);}
阅读全文
0 0
- 循环赛程安排
- 循环赛程安排
- 篮球循环赛:给出循环塞的赛程安排
- 赛程安排问题
- 赛程安排问题
- 单循环赛程安排问题
- 分治法--循环赛赛程安排
- 【分治法】赛程安排问题
- 【模拟退火】【NOI2008】赛程安排
- 分治算法-选手赛程安排
- 循环赛赛程安排---递归思想
- 分治算法求解赛程安排
- 赛程安排--基于多边形思想
- 第十四届男篮世锦赛赛程安排
- 【程序8】乒乓球比赛赛程安排
- 比赛赛程安排算法--分治算法
- 分治算法之赛程安排问题
- 网球循环赛赛程安排(分治策略)---附带详细代码
- Git基本使用(概念和命令)
- StringUtils.leftPad();//生成长度为多少位的数据,以什么进行补位
- 说说javap命令
- mui点击消息框的用法,及其点击呼叫拨打电话
- shiro rememberMe maxAge
- 循环赛程安排
- Laravel Base table or view already exists: 1050 Table 'users' already exists
- Linux_1 基础指令学习
- Linux中的DNS服务
- Idea 远程调试
- Centos 7 搭建git服务器+gitolite鉴权
- 垃圾回收
- 线程浅析
- 框架学习之路