题目
设有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");
}
}