| 比赛competition | 
| 难度级别:A; 运行时间限制:1000ms; 运行空间限制:256000KB; 代码长度限制:2000000B | 
| 试题描述 | 
| 设你班有n=2^m个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: 1. 每个选手必须与其他n-1个选手各赛一次。 2. 每个选手一天只能参赛一次。 3. 循环赛在n-1天内结束。 请按此要求将比赛日程表设计成有n行和n列的一个表,表的形式和内容如下图所示。在表中的第i行、第j列处填入第i个选手在第j天所遇到的选手。 | 
| 输入 | 
| 输入m | 
| 输出 | 
| 表格式比赛安排表,各行数据两两之间用一个空格分隔 | 
| 输入示例 | 
| 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 | 
#include<iostream>
#include<cstdio>
using namespace std;
int a[100][100];
void table(int k,  int n)
{
    for(int i=1; i <= n;  i ++)
    {
        a[1][i] = i;
    }
    int m = 1;                                                  
    for(int s = 1; s <= k; s++)
    {
        n/=2;
        for(int t = 1; t <= n; t++)
            for(int i = m+1; i <= 2*m; i++)
                for(int j = m+1; j <= 2*m; j++)
                {
                    a[i][j+(t-1)*m*2] = a[i-m][j+(t-1)*m*2-m]; 
                    a[i][j+(t-1)*m*2-m] = a[i-m][j+(t-1)*m*2]; 
                }
        m *= 2; 
    }
}
int main( )
{
    int k;
    cin >> k;
    int n = 1;
    for(int i = 1; i <= k; i++)
        n *= 2;
    table(k, n);
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= n; j ++)
        {
            printf("%d%c", a[i][j], j!=n?‘ ‘:‘\n‘);
        }
    }
}
原文:http://www.cnblogs.com/DZRDerek/p/6021032.html