- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)