循环赛日程表
分治法不仅可以用来设计算法,而且再其他方面也有广泛应用:利用分治法设计电路、构造数学证明等。
循环赛日程标问题,设有n=2k个选手要进行循环赛,设计一个满足以下要求的比赛日程表:
每个选手必须与其他n-1个选手各赛一次;
每个选手一天只能赛一次;
循环赛一共进行n-1天。
按此要求,可以将比赛日程表设计成n行n-1列的表格,i行j列表示第i个选手在第j天所遇到的选手。
基本思路:按分治策略,将所有的选手分为两组,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。递归地用对选手进行分割,直到只剩下2个选手时,比赛日程表的制定就变得很简单。这时只要让这2个选手进行比赛就可以了。
选手数n为一般情况时,试设计循环赛日程表算法,并求出循环赛所需要的最少天数。(提示:当n为偶数时,比赛至少需要n-1天;当n为奇数时,比赛至少需要n天。)
算法代码
#include <iostream>
#include <cmath>
using namespace std;
void GameTable(int k, int a[100][100]);
void PrintTable(int k, int a[100][100]);
int main()
{
int date[100][100]; //日程表数组
int k;
cout << "请输入K的值:" ;
cin >> k;
cout << "日程表如下:" << endl;
GameTable(k, date);
PrintTable(k, date);
re