网球循环赛问题

来源:互联网 发布:手机上淘宝联盟怎么用 编辑:程序博客网 时间:2024/04/29 04:58

题目如下:

设有n个运动员进行网球循环赛。设计一个满足下列要求的比赛日程表:

1)每个选手必须与其他n-1个选手比赛一次;

2)每个选手一天只能赛1

3)当n是偶数时,循环进行n-1天,当n是奇数时,循环赛进行n

 

有两个版本,一个是网上比较通用的一个版本,不过感觉好难理解,还是贴出来吧

代码如下:

/*5设有n个运动员进行网球循环赛。设计一个满足下列要求的比赛日程表:(1)每个选手必须与其他n-1个选手比赛一次;(2)每个选手一天只能赛1次(3)当n是偶数时,循环进行n-1天,当n是奇数时,循环赛进行n天*/#include<stdio.h>#define N 1000void fun(int n);void copy(int n);void copy1(int n);void copy2(int n);int a[N][N],b[N];void copy(int n){if(n/2>1&&n/2%2!=0)copy1(n);elsecopy2(n);}void copy1(int n){int m,i,j;m=n/2;for(i=0;i<m;i++){b[i]=m+i;b[m+i]=b[i];}for(i=0;i<m;i++){for(j=0;j<m+1;j++)//由左上角小块的值算出相应的左下角小块的值{if(a[i][j]>=m){a[i][j]=b[i];a[m+i][j]=(b[i]+m)%n;}elsea[m+i][j]=a[i][j]+m;}for(j=1;j<m;j++)//由左上角小块的值算出相应的右上角和右下角小块的值{a[i][m+j]=b[i+j];a[b[i+j]][m+j]=i;}}}void copy2(int n){int i,m,j;    m=n/2;    for(i=0;i<m;i++){for(j=0;j<m;j++){a[i][j+m]=a[i][j]+m;//由左上角小块的值算出对应的右上角小块的值a[i+m][j]=a[i][j+m];//由右上角小块的值算出对应的左下角小块的值a[i+m][j+m]=a[i][j];//由左上角小块的值算出对应的右下角小块的值}}}void fun(int n){if(n==1){a[0][0]=0;return;}if(n%2==1){fun(n+1);return;}fun(n/2);copy(n);}void main(){int i,num,j;printf("参赛队伍数:");scanf("%d",&num);fun(num);if(num%2!=0)num++;for(i=1;i<num;i++){for(j=0;j<num;j++){printf("%d ",a[i][j]+1);}printf("\n");}printf("注:当n为奇数时代号为n+1的球队,当天轮空!\n");}


下面一个是我自己做的一个版本

代码如下:

#include<iostream>#include<vector>#define M 100using namespace std;vector<int > b;int a[M][M];int k=0;void fun(int n);void prin(int n);void main(){ int num; printf("please input:"); scanf("%d",&num); for(int i=1;i<=num;i++) b.push_back(i); fun(num); for(int j=0;j<k;j++) { for(int h=1;h<=num;h++) { cout<<a[j][h]<<" "; }cout<<endl; }}void prin(int n){  for(int j=0;j<(n+1)/2-1;j++) {a[k][b[j]]=b[n-1-j];a[k][b[n-1-j]]=b[j]; } if(n%2) {a[k][b[(n+1)/2-1]]=0; } else {a[k][b[(n+1)/2-1]]=b[(n+1)/2];a[k][b[(n+1)/2]]=b[(n+1)/2-1]; } k++; b.push_back(b.front()); b.erase(b.begin());}void fun(int n){ int m=n; if(n%2) {m++; } for(int i=1;i<m;i++) {prin(n); }}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信钱包里的零钱不见了怎么办 买家说支付宝没钱要微信付钱怎么办 微信红包没绑卡密码忘了怎么办 手机微信红包密码忘了怎么办 qq账号忘了怎么办什么也没绑定 手机银行转账名字对卡号错了怎么办 手机夸行转账卡号输入错了怎么办 移动开通了20元流量卡怎么办? 联通手机充值卡网上充值话费怎么办 提现金额和实际到账不一样怎么办 二冲踏板冷车加油熄火怎么办? qq被盗绑定了别人的银行卡怎么办 如何更改微信支付密码忘记了怎么办 微信钱包没绑银行卡忘记密码怎么办 微信密码忘记了也没绑银行卡怎么办 微信支付密码忘记了没银行卡怎么办 想找回原来的k歌忘了密码怎么办 手机微信钱包支付密码忘了怎么办 微信支付账户被注销了怎么办 微信钱包密码忘了怎么办没绑银行卡 微信钱包密码忘了怎么办不用银行卡 企业网银密码输入三次错误怎么办 微信密码不知道手机也停用了怎么办 手机停用微信密码不记得了怎么办 农商银行登入密码忘记了怎么办 苹果手机忘记四位数解锁密码怎么办 银行卡用支付宝支付限额了怎么办 用银行卡号找回微信被盗密码怎么办 微信钱包密码错误被锁定怎么办 本人没玩财付通结果被扣了钱怎么办 我的银行卡给支付宝充不了钱怎么办 支付宝话费充错了怎么办啊 已充值成功送朋友话费不能送怎么办 微信绑定银行卡被盗刷q币怎么办 微信红包过了24小时没退回怎么办 微信6.67版本红包发错了怎么办 苹果6s还原后激活出错怎么办 q币充给了不存在的账号怎么办 怎么办微信的钱换成淘宝币 学信网密码密保手机号都忘了怎么办 第五人格玩游戏时总是闪退怎么办