1)每位选手必须与其他n-1名选手比赛一次;
2)每位玩家每天只能参加一次比赛。
根据上述要求,比赛表可以设计为一个n行n-1列的二维表,其中第i行j列的元素代表第i-个选手的编号。第 j 天比赛的第 名选手,即对手。 。
使用分而治之的策略,所有参与游戏的玩家可以分为两部分。 n=2^k个玩家的游戏日程可以由n=2^(k-1)个玩家的游戏日程确定。 这种划分会递归进行,直到只剩下两名玩家,通过这种分而治之的策略可以逐步构建游戏时间表。
从 0 开始对各列进行编号。第 0 列是您与自己比赛的号码,第 1 列是比赛第一天对手的号码。 表格中具有相同颜色的部分是相同的。
当只有两支球队时:
当有四支球队时:
当有八支球队时:
算法如下:
初始化一个数组a[n-1][n-1],输入:球队数量n。
1、当n=0时
a[0][0]=1;
2.n>0
1、当n>0时,将问题一分为二,递归生成左上角矩阵。
2、然后根据左上角矩阵,让右上角矩阵对应元素+n/2。
3、然后将左下角元素与右上角元素进行匹配,将右下角元素与左上角元素进行匹配。
代码
#include
using namespace std;
#define M 10000
int a[M][M]={0};
void merge(int n)
{
int m= n/2;
for(int i=0;i>n;
cout<<"赛程安如下:"<