循环比赛日程(递归解法)

问题描述:

    设有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;
}
posted @ 2010-07-15 23:02  忧国忧铭  Views(1467)  Comments(0)    收藏  举报