循环比赛日程(递归解法)
问题描述:
设有n=2k个运动员要进行网球循环赛。现要设计一个满足一下要求的比赛日程表
(1) 每个选手必须与其他n-1个选手个比赛一次;
(2) 没个选手一天只能赛一次;
(3) 循环赛一共进行n-1天。
按此要求可将比赛日程设计成有n行和n-1列的表。在表中的第i行和第j列处填入地i个选手在第j天遇到的选手。
#include <iostream>
using namespace std;
#define TABLE_SIZE 8
int table[TABLE_SIZE][TABLE_SIZE];
void Creattable(int r1,int c1,int r2,int c2,int size)
{
int i,j;
int halfsize=size/2;
if(size>1)
Creattable(0,0,halfsize,halfsize,halfsize); //递归创建左上角的赛程表
else
table[0][0]=1;
for(i=0;i<size;i++)
for(j=0;j<size;j++)
{
//右上角的赛程是左上角的赛程加上halfsize
if(i<halfsize && (j>=halfsize && j<size))
table[i][j]=table[i][j-halfsize]+halfsize;
//左下角的赛程和右上角的赛程相同
if((i>=halfsize && i<size) && j<halfsize)
table[i][j]=table[i-halfsize][j+halfsize];
//右下角的赛程和左上角的赛程相同
if((i>=halfsize && i<size) && (j>=halfsize && j<size))
table[i][j]=table[i-halfsize][j-halfsize];
}
}
int main()
{
int i,j;
Creattable(0,0,TABLE_SIZE,TABLE_SIZE,TABLE_SIZE);
for(i=0;i<TABLE_SIZE;i++)
{
cout<<"运动员"<<table[i][0]<<"的每日赛程: ";
for(j=1;j<TABLE_SIZE;j++)
cout<<table[i][j]<<" ";
cout<<endl;
}
return 0;
}