题目描述
设有 N 个选手进行循环比赛,其中 N=2^M,要求每名选手要与其他 N-1 名选手都赛一次,每名选手每天比赛一次,循环赛共进行 N-1 天,要求每天没有选手轮空。
输入
一个整数 M
输出
表格形式的比赛安排表,注意,如果数是小于等于 9 的,那么后面有两个空格,如果数是大于 9 的,那么后面有一个空格。
样例数据
输入 #1
3
输出 #1
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
拼好,于是1+(1*2)=3, 2+(1*2)=4 就有了
1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1
拼好,于是1+(2*2)=5, 2+(2*2)=6 , 3+(2*2)=7 , 4+(2*2)=8 就有了
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,右下边的等于左边的。这又成了一个整体的数。凑齐4个整体的数,又开始重复操作......以此循环。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m=2;
int a[1005][1005];
int main()
{
a[1][1]=a[2][2]=1,a[1][2]=a[2][1]=2;
scanf("%d",&n);
for(int i=1;i<=n-1;i++)
{
for(int j=1;j<=m;j++)
{
for(int i1=1;i1<=m;i1++)
{
a[j+m][i1]=a[j][i1]+m,a[j][i1+m]=a[j][i1]+m,a[j+m][i1+m]=a[j][i1];
}
}
m*=2;
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
printf("%d ",a[i][j]);
if(a[i][j+1]<=9)
{
printf(" ");
}
}
printf("\n");
}
return 0;
}
3364

被折叠的 条评论
为什么被折叠?



