#include<iostream>
#include<string>
using namespace std;
const int maxn=64;//最多安排64个人
int a[maxn+1][maxn+1]={0};
void game(int k,int n)//安排编号为k开始的n个运动员的比赛日程
{
if(n==2)//分治到只有两个人比赛
{
a[k][1]=k;//参赛选手的编号
a[k][2]=k+1;//参赛选手的对手编号
a[k+1][1]=k+1;
a[k+1][2]=k;
}
else
{
game(k,n/2);//分治为前半部分的人来比赛
game(k+n/2,n/2);//后半部分的人的赛程安排
//填充右上角
for(int i=k;i<k+n/2;i++)
{
for(int j=n/2+1;j<=n;j++)
{
a[i][j]=a[i+n/2][j-n/2];
}
}
//填充左下角
for(int i=k+n/2;i<k+n;i++)
{
for(int j=n/2+1;j<=n;j++)
{
a[i][j]=a[i-n/2][j-n/2];
}
}
}
}
int main()
{
int num;
cout<<"请输入参赛选手的人数(2的幂次方,且不超过64人):"<<endl;
cin>>num;
game(1,num);
cout<<"编号 ";
for(int i=1;i<num;i++)
cout<<"第"<<i<<"天 ";
cout<<endl;
for(int i=1;i<=num;i++)//运动员编号
{
for(int j=1;j<=num;j++)//对手编号
cout<<" "<<a[i][j]<<" ";
cout<<endl;
}
return 0;
#include<string>
using namespace std;
const int maxn=64;//最多安排64个人
int a[maxn+1][maxn+1]={0};
void game(int k,int n)//安排编号为k开始的n个运动员的比赛日程
{
if(n==2)//分治到只有两个人比赛
{
a[k][1]=k;//参赛选手的编号
a[k][2]=k+1;//参赛选手的对手编号
a[k+1][1]=k+1;
a[k+1][2]=k;
}
else
{
game(k,n/2);//分治为前半部分的人来比赛
game(k+n/2,n/2);//后半部分的人的赛程安排
//填充右上角
for(int i=k;i<k+n/2;i++)
{
for(int j=n/2+1;j<=n;j++)
{
a[i][j]=a[i+n/2][j-n/2];
}
}
//填充左下角
for(int i=k+n/2;i<k+n;i++)
{
for(int j=n/2+1;j<=n;j++)
{
a[i][j]=a[i-n/2][j-n/2];
}
}
}
}
int main()
{
int num;
cout<<"请输入参赛选手的人数(2的幂次方,且不超过64人):"<<endl;
cin>>num;
game(1,num);
cout<<"编号 ";
for(int i=1;i<num;i++)
cout<<"第"<<i<<"天 ";
cout<<endl;
for(int i=1;i<=num;i++)//运动员编号
{
for(int j=1;j<=num;j++)//对手编号
cout<<" "<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}