循环赛程问题
有N个运动员进行单循环赛,即每个运动员要和所有其他运动员进行一次比赛。将运动员从1到N编号。只考虑次幂的情况,即N=2^k
试用分治法为这N个运动员安排比赛日程。
(1)每个运动员要和其他N-1个运动员进行一次比赛
(2)要求每个运动员每天只进行一场比赛。
(3)且整个赛程在N -1天内结束。
#include<iostream>
using namespace std;
#define MAX 50
int table[MAX][MAX];
void fillTable(int x, int y, int step)
{
if(step==1)
return;
step /= 2;
fillTable(x,y,step); //填写左上的表格
fillTable(x+step,y,step); //填写左下的表格
for(int i=0; i<step; i++)
for(int j=0; j<step; j++){
table[x+step+i][y+step+j] = table[x+i][y+j]; //右下表格抄左上表格
table[x+i][y+step+j] = table[x+step+i][y+j]; //右上表格抄左下表格
}
}
int main()
{
int n; //人数
ls:
cout<<"请输入比赛的选手数量"<<endl;
cin>>n;
cout<<"日期 ";
for(int i=1; i<n; i++)
cout<<i<<" ";
cout<<endl;
cout<<"选手 ";
for(int i=1; i<n; i++)
cout<<"-----";
cout<<endl;
for(int i=1; i<=n; i++)
table[i][1]=i;
fillTable(1, 1, n);
for(int i=1; i<=n; i++){
cout<<" "<<table[i][1]<<" |";
for(int j=2; j<=n; j++)
cout<<" "<<table[i][j]<<" ";
cout<<endl;
}
goto ls;
system("pause");
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/5e1eab78eb6b1af08cdc39f6ae59ee57.png)