题目描述
设有N个选手进行循环比赛,其中N=2M,要求每名选手要与其他N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空。
输入
M(1<=M<=6)
输出
表格形式的比赛安排表,每个数占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
这题要找到规律,可发现它可分为4个n/2*n/2的矩形,可以分为4个部分逐个填数即可
//
// main.cpp
// 问题 B: 循环比赛日程表
//
// Created by wenhan on 2017/8/9.
// Copyright © 2017年 wenhan. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int a[65][65]={0};
void tiansu(int x,int y,int z,int n)
{
if(n==2)
{
a[x][y]=z;
a[x][y+1]=z+1;
a[x+1][y]=z+1;
a[x+1][y+1]=z;
}
else
{
tiansu(x, y, z, n/2);//左上角
tiansu(x+n/2, y, z+n/2, n/2);//左下角
tiansu(x, y+n/2, z+n/2, n/2);//右上角
tiansu(x+n/2, y+n/2, z, n/2);//右下角
}
}
int main() {
int n;
cin>>n;
int x=pow(2,n);
tiansu(1, 1, 1, x);
for(int i=1;i<=x;i++)
{
for (int j=1; j<=x; j++) {
printf("%3d",a[i][j]);
}
printf("\n");
}
// insert code here...
//std::cout << "Hello, World!\n";
return 0;
}