算法设计与分析 | 循环赛

题目
设有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<stdio.h>
#include<math.h>
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");
				
	}	
}
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值