当前位置:首页 > 题解目录 > 正文内容

【题解】循环比赛日程表

亿万年的星光3年前 (2022-04-09)题解目录2293

【题目描述】

设有N个选手进行循环比赛,其中N=2M,要求每名选手要与其他N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空。

【输入描述】

输入:M。

【输出描述】

输出:表格形式的比赛安排表。一行各数据间用一个空格隔开。

【样例输入】

3

【样例输出】

1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 5 6
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 2 1 4 3
7 8 5 6 3 4 1 2
8 7 6 5 4 3 2 1

【题目分析】

    以m=3(即 n=2^3=8)为例,可以根据问题要求,制定出如下表所示的一种方案∶

    以表格的中心为拆分点,将表格分成 A、B、C、D 四个部分,就很容易看出有 A=D,B= C,并且这一规律同样适用于各个更小的部分。


        设有n个选手的循环比赛,其中 n=2^m,要求每名选手要与其他n-1名选手都赛一次。每名选手每天比赛一次,循环赛共进行 n-1天。要求每天没有选手轮空,以下是八名选手时的循环比赛表,表中第一行为八位选手的编号,下面七行依次是每位选手每天的对手。


从八位选手的循环比赛表中可以看出,这是一个具有对称性的方阵,可以把方阵一分为四来看,那么左上角的 4×4 的方阵就是前四位选手的循环比赛表,而右上角的 4*4 的方阵就是后四位选手的循环比赛表,它们在本质上是一样的,都是4 个选手的循环比赛表,所不同的只是选手编号不同而已,将左上角中方阵的所有元素加上 4 就能得到右上角的方阵。下方的两个方阵表示前四位选手和后四位选手进行交义循环比赛的情况,同样具有对称性,将右上角方阵复制到左下角即得到1、2、3、4 四位选手和 5、6、7、8 四位选手的循环比赛表,根据对称性,右下角的方阵应与左上角的方阵相同。这样,八名选手的循环比赛表可以由四名选手的循环比赛表根据对称性生成出来.同样地,四名选手的循环比赛表可以由二名选手的循环比赛表根据对称性生成出来,而两名选手的循环比赛表可以说是已知的,这种程序设计方法叫做分治法,其基本思想是把一个规模为 n 的问题分成若干个规模较小的问题,使得从这些较小问题的解易于构造出整个问题的解。

程序中用数组 arr 记录 n 名选手的循环比赛表,整个循环比赛表从最初的 1*1的方阵按上述规则生成出2*2 的方阵,再生成出 4*4 的方阵,…,直到生成出整个循环比赛表为止。变量half表示当前方阵的大小,也是要生成的下—个方阵的大小的一半。


【参考代码】

#include<stdio.h>
int arr[1000][1000];
int m;
int main()
{
	int i,j,n,k=1,half=1;
	scanf("%d",&m);
	// 1<<m 相当于2^m
	n=1<<m;
	arr[0][0]=1;
	while(k<=m)       			//构造右上方方阵
	{
		for(i=0;i<half;i++)
			for(j=0;j<half;j++)
				arr[i][j+half]=arr[i][j]+half;
	
		for(i=0;i<half;i++)  		//对称交换构造下半部分方阵
			for(j=0;j<half;j++)
			{
				arr[i+half][j]=arr[i][j+half];   //左下方方降等于右上方方阵
				arr[i+half][j+half]=arr[i][j];     //右下方方降等于左上方方阵
			}
		half*=2;
		k++;
	} 
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
			printf("%d ",arr[i][j]);
		printf("\n");
	}
	return 0;
}



扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

标签: 分治
分享给朋友:

相关文章

【题解】牛的阵容

【题目描述】农民约翰雇一个专业摄影师给他的奶牛拍照。由于约翰的牛有很多品种,他喜欢他的照片包含每个品种至少一头牛。约翰的牛都站在数轴的不同地方,每一头牛由一个整数位置 X_i 以及整数品种编号 ID_...

【题解】特殊的质数肋骨

【题目描述】农民约翰母牛总是产生最好的肋骨。你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组...

【题解】阶乘的末尾

【题目描述】n的阶乘定义为n!=1*2*3*……*n  如3!=6   n!通常最后会有很多0,如5!=120  最后有一个0,现在统计n!去除末尾的0后,最后k位是多少...

【题解】合根植物

【题解】合根植物

【题目描述】w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成...

【题解】队列问题

【题解】队列问题

4.队列问题(lru.cpp)【题目描述】有一个大小为n的页面缓存队列,初始为空,当计算机访问页面时,若缓存队列没有该页面,则加入到缓存队列中,若队列已满,则将删除访问时间最远的页面。有Q次询问,每次...

【题解】最大公约数(2019青岛市程序设计竞赛)

【问题描述】给定n,以及正整数序列a1,a2,…,an与b1,b2,…,bn。令:sa=a1*a2*…*ansb=b1*b2*…*bn求sa和sb的最大公约数gcd(sa,sb)。【输入】第一行n。第...