循环赛日程表_任意人数.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
/ 一、问题描述: 设有n个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: 每个选手必须与其他 n-1 个选手各赛一次; 每个选手一天只能参赛一次; N是偶数时,循环赛在n-1天内结束。N是奇数时,循环赛进行N天. 请按此要求将比赛日程表设计成有 n行和n-1列(或n列)的一个表。在表中的第i行, 第j列处填入第i个选手在第j天所遇到的选手。其中 m旬,弓韦-1。 二、基本思想(所用数组下标从开始) 区分队伍的奇偶情况(奇数时有队伍要轮空)。 n为奇数时 首先,选取前 n-1 个运动员构建初始对阵关系序列: b(1,n-1,2,n-2,...,i,n-i,...) 然后,计算第i天比赛对应的序列:序列 b+i (i取值范围为?n) (计算时)序列的每个元素均加 i,并且当序列元素加i后如果大于n则将其对n求余 序列 b+1 - 序列 b+2 - - 序列 b+n-1 - 序列 b+n 第天 第天 第n-1天 第n-1天 (比赛时)相邻运动员对阵(即下标 ,2 表示运动员对阵,下标 ,4表示运动员对阵 ... ), 并且在第 i 天第 i 号运动员轮空。 n 为偶数时 首先,选取前 n-1 个运动员按照其数情况安排比赛 然后,将第n号运动员填入前n-1个运动员比赛安排中的轮空位置,并依据其建立 第n行比赛日程安排 */ #include iostream using namespace std; void odd_table ( int **a , int n) { int i,j; int *b; // 指向对阵关系数组 // 建立初始对阵关系( ,n-1,2,n-2,...,i,n-i ) b=new int [n]; //0 下标不用 for (i=1;i=n/2;i++) { b[2*i-1]=i; b[2*i]=n-i; } for (i=1;i=n;i++) //i 控制天数变化 { a[i][i]=0; //n 为奇数时在第 i 天第 i 号运动员轮空 for (j=1;j=(n-1);j+=2) { //第i天ml与m2对阵 int m1=((b[j]+i)=n)?(b[j]+i):(b[j]+i)%n; int m2=((b[j+1]+i)=n)?(b[j+1]+i):(b[j+1]+i)%n; a[m1][i]=m2; a[m2][i]=m1; } } } int main() { int i,j; // 循环控制变量 int days; // 比赛天数 int n; // 参赛队数 int **a; // 日程表 cout 请输入运动员人数: ; cin n; if (n=1) cout 数据非法 ; else { a=new int * [n+1]; // 行表示运动员 days = n%2==0?n-1:n; //比赛天数,n是偶数时,n-1天。n是奇数时,n天. for ( int i=1;i=(n+1);i++) a[i] = new int [days+1]; } if (n%2!=0) odd_table(a,n); else { odd_table(a,n-1); //加入第n个运动员的比赛日程,只需将其加入到前 n-1个运动员日程中轮空位置即可 for (i=1;i=n;i++) //i 控制天数变化 { a[i][i]=n; a[n][i]=i; } } // 输出表头 cout \n\t ; for (j=1;j=days;j++) cout 第 j 天 ; coutendl; // 输出比赛日程 for (i=1;i=n;i++) { cout 第 i 号 for (j=1;j=days;j++) couta[i][j] cout \n ; } }

文档评论(0)

xiaozu + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档