循环比赛(C++)

题目描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值