C++迴圈賽日程表

至尊發表於2020-10-05

迴圈賽日程表


  1. 設計一個滿足以下要求的比賽日程表
  2. 每個選手必須與其他n-1個選手各賽一次
  3. 每個選手一天只能賽一次
  4. 迴圈賽一共進行n-1天

思路:

按分治策略,將所有的選手分為兩半,n個選手比賽日程表就可以通過為n/2個選手設計的比賽日程表來決定。遞迴的使用對選手進行分割,直到只剩下兩個選手時,比賽日程表的制定就變得很簡單。這時只要讓這2個選手進行比賽就可以了。

注意A這裡的也可以繼續分成四個小塊,就是這樣的遞迴思路。
轉自https://blog.csdn.net/yatyou/article/details/12647851

ok,talking is cheap,show me the code

#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>
using namespace std;

/*
*迴圈賽日程表(遞迴法)
*/

void Copy(int **map, int sr, int sl, int dr, int dl, int k)
{
	for (int i = 0; i < k; i++)
	{
		for (int j = 0; j < k; j++)
		{
			map[dr + i][dl + j] = map[sr + i][sl + j];
		}
	}
}

void Table(int **map, int r, int l, int k)
{
	if (1 == k)return;
	//填充左上角
	Table(map, r, l, k / 2);
	//填充右上角
	Table(map, r, l + (k / 2), k / 2);
	//從左上角拷貝到右下角
	Copy(map, r, l, r + k / 2, l + k / 2, k / 2);
	//從右上角拷貝到左下角
	Copy(map, r, l + k / 2, r + k / 2, l, k / 2);
}

int main()
{
	int k;
	//輸入運動員的人數
	cin >> k;
	int ** p = new int*[k];
	//賽程表初始化
	for (int i = 0; i < k; i++)
	{
		p[i] = new int[k];
		p[0][i] = i + 1;
		p[i][0] = i + 1;
	}
	//執行函式
	Table(p, 0, 0, k);
	//輸出結果
	cout << "迴圈賽日程表(遞迴法):" << endl;
	for (int i = 0; i < k; i++)
	{
		copy(p[i], p[i] + k, ostream_iterator<int>(cout, " "));
		cout << endl;
	}
	return 0;
}
轉載自自由不死,是真的強,我看了半天才明白

相關文章