算法设计与分析 | 循环赛

题目
设有n=2k个球队参加循环赛,要求设计一个满足以下要求比赛日程表:

(1)  每支球队必须与其他n-1支球队各赛一次;

(2)  每支球队一天只能参赛一次;

(3)  循环赛在n-1天内结束。

输入
一个整数k(0 <= k <=  6)
输出

输出一个n行n列的表,在表中的第i行,第j列处填入为第i个球队在第j天所遇到的球队。8个球队的比赛日程如样例输出所示

样例输入

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 

分析

该题主要要观察它的输出规律,因为左上角的【1 2 2 1】和右上角的【3 4 4 3】,左下角的【3 4 4 3】,右下角的【1 2 2 1】,右上角和左下角的都是在以左上角的数字的基础上+2,而右下角是copy左上角的数字。

代码

//循环赛
#include
#include
int main()
{
	//定义二维数组
	int s[64][64] = { 0 };
	int i=0, j=0;
	int inial = 2, c=0,b=0;
	scanf("%d", &b);
	int t=0;
	s[0][0] = 1, s[0][1] = 2;
	s[1][0] = 2, s[1][1] = 1;
	for (i = 1; i < b; i++)
	{
		c = inial;
		inial = inial * 2;
		//左下角:把左上角的数字加c
		for (t = c; t < inial; t++)
		{
			for (j = 0; j < inial; j++)
				s[t][j] = s[t - c][j] + c;
		}
		//右上角:把左上角的数字加c
		for (t = 0; t < inial; t++)
		{
			for (j = c; j < inial; j++)
				s[t][j] = s[t][j - c] + c;
		}
		//右下角:把左上角的数字copy给右下角
		for (t = c; t < inial; t++)
		{
			for (j = c; j < inial; j++)
				s[t][j] = s[t - c][j - c];
		}
	}
	for (i = 0; i < pow(2, b); i++) {
		
		for (j = 0; j < pow(2, b); j++) {
				printf("%d ", s[i][j]);
		}
		printf("\n");
				
	}	
}

你可能感兴趣的:(算法设计与分析,算法,开发语言)