Problem J
循环赛日程表
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
用分治算法生成循环赛日程表(1到2的n次方个人)
输入:
一个小于等于7的正整数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;
int a[200][200];
int n;
//分治法
void table(int start, int len)
{
if(len>1)
{
len /= 2;
table(start, len);
table(start+len,len);
//左上复制到右下
for (int i = start; i < start+len; ++i)
{
for (int j = 0; j < len; ++j)
{
a[i+len][j+len] = a[i][j];
}
}
//左下复制到右上
for (int i = start+len; i < start+len+len; ++i)
{
for (int j = 0; j < len; ++j)
{
a[i-len][j+len] = a[i][j];
}
}
}
}
void display(int k)
{
for (int i = 0; i < k; ++i)
{
for (int j = 0; j < k-1; ++j)
{
cout<<a[i][j]<<" ";
}
//每行最后一个元素没有空格,因此wa了一次,真鸡儿操蛋
cout<<a[i][k-1]<<endl;
}
}
int main(int argc, char const *argv[])
{
cin>>n;
int k = pow(2,n);
//第0列初始化为 1,2,3,4,5,6,7,8
for (int i = 0; i < k; ++i)
{
a[i][0] = i+1;
}
table(0,k);
display(k);
return 0;
}