循环赛日程表
时限: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
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; }