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

【题解】循环比赛日程表

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

【题目描述】

设有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;
}



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

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

标签: 分治
分享给朋友:

相关文章

【题解】线段

【题目描述】在一个数轴上有n条线段,现选取其中k条线段使得这k条线段两两没有重合部分,问最大的k为多少?【输入描述】第一行为一个正整数n,下面n行每行2个数字ai,bi,描述每条线段。【输出描述】输出...

哥德巴赫猜想

【题目描述】哥德巴赫猜想的命题之一是:大于6 的偶数等于两个素数之和。编程将6~100所有偶数表示成两个素数之和。【输入描述】无【输出描述】分行输出例如:6=3+38=3+5…(每个数只拆开一次,请保...

【题解】踩方格

【题目描述】有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;b、走过的格子立即塌陷无法再走第二次;c、只能向北、东、西三个方向走;请问...

【题解】数字三角问题

【题解】数字三角问题

【题目描述】给字一个由n行数字组成的数字三角形(等腰三角形)。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。【输入描述】数字三角形的行数和数字三角形【输出描述】最大的路...

【题解】跳格子

【题目描述】地面上有一排长度为n的格子1-n,每个格子上都有一个数xi,开始时你在位置0,每次你可以向前跳1-2格,然后取走格子上的数,直到跳到位置n+1。取走的数的和就是你的得分,现在你想知道你可能...

【题解】大数取模

【题目描述】求m%n。【输入描述】两个数,m和n。【输出描述】m模n的值。【样例输入】3【样例输出】2【数据范围】对于30%的数据, 1<m<10^18对于70%的数据, m>10^...