循环赛日程表

循环赛日程表

时限:1000ms 内存限制:10000K  总时限:3000ms

描述
用分治算法生成循环赛日程表(1到2的n次方个人)
 
输入
一个整数n
 
输出
循环赛日程表(1到2的n次方个人)
 
输入样例
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 <math.h>
using namespace std;
static int data[129][129];
void Merge(int num)
{
    for(int i = 1;i <= num/2; i++)
        for(int j = 1;j <= num/2; j++)
        {
            data[i][j+num/2] = data[i][j]+(num/2);  //正右方填充
            data[i+num/2][j] = data[i][j]+(num/2);  //正下方填充
            data[i+num/2][j+num/2] = data[i][j];    //右下方填充
        }

}
void Manage(int num,int n)          //num表示方阵的大小,n表示迭代的层次
{
    if(n==0)
    {
        data[1][1] = 1;
    }
    else
    {
        Manage(num/2,n-1);
        Merge(num);
    }
}
void Show(int num)
{
    for(int i = 1;i <= num/2; i++)
    {
        for(int j = 1;j <= num/2; j++)
            cout<<data[i][j]<<" ";
        cout<<endl;
    }

}
int main()
{
    int n,num;
    cin>>n;
    n++;
    num = powl(2,n);
    Manage(num,n);
    Show(num);
    return 0;
}

  

posted @ 2015-03-22 20:28  再见,少年  Views(244)  Comments(0Edit  收藏  举报