用C语言编译,一定要可以运行的噢!有错我不会改 问题补充:题目是:网球循环赛日程表(p100,

2020-09-15 教育 87阅读
/*9.问题描述:设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手一天只能参赛一次;
(3)循环赛在n-1天内结束。
请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。其中1≤ i ≤n,1≤j≤n-1。
*/
#include
#include
using namespace std;
void table(int n)
{
int flag,i,j,t;
//动态内存分配
int *a=new int[n]();
int **b=new int*[n]();
for(i=0;ib[i]=new int[n]();
for(i=0;ia[i]=i+1;
for(i=0;ib[i][0]=i+1; //使比赛日程表第一列为从1到n的数 代表选手序号
for(j=1;j{
for(i=0;i<=n-1;i++)
{
if(i==0)
b[i][j]=j+1; //如果是第一行则为第一个选手与第j+1个选手比赛
else if(i==j)
b[i][j]=1; //如果行数列数相等 则代表第j+1个选手与第一个选手比赛
else
for(t=1;t{
if((i+1)==a[t]) //找到a中与选手序号相等的元素
b[i][j]=a[n+1-t]; //则与第i+1个选手比赛的为a中第n+1-t个选手
}
}
for(i=1;i<=n-2;i++)
{
if(i==1)
{
flag=a[n-1]; //用flag存最后一个数组元素
a[n-1]=a[1]; //最后一个元素等于第二个元素
}
a[i]=a[i+1]; //每一个元素等于其后一个元素的值
if(i==n-2)
a[i]=flag; //倒数第二个元素等于原先最后一个元素
}
}
for(i=0;ifor(j=0;jcout<cout<}
cout<//释放空间
delete a;
delete b;
}
int main()
{
int k,n;
cout<<"请输入k:";
cin>>k;
n=2*k;
cout<<"循环赛事日程表为:"<table(n);
return 0;
}
//第一次写的程序 已通过 无错误
/*
#include
using namespace std;
void table(int n)
{
int flag;
int *a=new int[n]();
int **b=new int*[n]();
for(int i=0;ib[i]=new int[n]();
for(int i=0;ia[i] =i+1;
for(int i=0;ib[i][0]=i+1;
for(int num=1,j=1;num<=n-1;num++,j++)
{
for(int i=0;i<=n-1;i++)
{
if(i==0)
b[i][j]=j+1;
else if(i==j)
b[i][j]=1;
else
for(int t=1;t{
if((i+1)==a[t])
b[i][j]=a[n+1-t];
}
/*{
for(int m=2;m<=n;m++)
{
for(int t=1;t{
if((m==a[t])&&(m!=j+1))
b[i][j]=a[n+1-t];
else if(m==(j+1))
b[i][j]=1;
}
}
}*//*
}
for(int i=1;i<=n-2;i++)
{
if(i==1)
{
flag=a[n-1];
a[n-1]=a[1];
}
a[i]=a[i+1];
if(i==n-2)
a[i]=flag;
}
}
for(int i=0;ifor(int j=0;jcout<cout<}
cout<}
int main()
{
int k,n;
cout<<"请输入k:";
cin>>k;
n=2*k;
cout<<"循环赛事日程表为:"<table(n);
return 0;
}
*/
//本题难度较大
//第一次把程序写出来时 很多错误 甚至输出很多负数 改了很多次 才把逻辑搞对
//中国地质大学王勋广写 侵权必究
声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com