|
|
#include <bits/stdc++.h>
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
//https://www.cnblogs.com/crx234/p/5988418.html
|
|
|
|
|
|
//日程表
|
|
|
int a[100][100];
|
|
|
|
|
|
int n; //选手的个数
|
|
|
|
|
|
/*
|
|
|
tox:目标数组的行号
|
|
|
toy:目标数组的列号
|
|
|
fromx:源数组的行号
|
|
|
fromy:源数组的列号
|
|
|
r:数组的大小为 r*r
|
|
|
这个函数本身没什么技术含量,就是一个方框内容拷贝的过程。关键在于调用时的参数传递。相当于一个辅助函数
|
|
|
*/
|
|
|
void Copy(int fromx, int fromy, int tox, int toy, int r) {
|
|
|
for (int i = 0; i < r; i++) //r*r这么大一块
|
|
|
for (int j = 0; j < r; j++)
|
|
|
a[tox + i][toy + j] = a[fromx + i][fromy + j];
|
|
|
}
|
|
|
|
|
|
void Print() {
|
|
|
//输出日程表
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
for (int j = 0; j < n; j++) {
|
|
|
cout << a[i][j] << " ";
|
|
|
}
|
|
|
cout << endl;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//分治法的核心函数
|
|
|
void Table(int k) {
|
|
|
n = 1 << k; // 1<<k表示的是2^k
|
|
|
//构造正方形表格的第一行数据,数据初始化
|
|
|
for (int i = 0; i < n; i++)
|
|
|
a[0][i] = i + 1;
|
|
|
|
|
|
//采用分治算法,构造整个循环赛日程表
|
|
|
for (int r = 1; r < n; r *= 2) //方框的边长,肯定是2倍2倍增长,也就是复制的方框长度
|
|
|
//i是准备复制的方框起点纵坐标,说白了就是从哪列开始,行的话每次都是从第0行开始。
|
|
|
for (int i = 0; i < n; i += 2 * r) {
|
|
|
cout << "r=" << r << ",i=" << i << endl;
|
|
|
cout << "左上角复制到右下角: fromx=" << 0 << ",fromy=" << i << ",tox=" << r << ",toy=" << r + i << ", 方框大小:" << r
|
|
|
<< endl;
|
|
|
Copy(0, i, r, r + i, r); //左上角复制到右下角
|
|
|
Print();
|
|
|
|
|
|
cout << "右上角复制到左下角: fromx=" << 0 << ",fromy=" << r + i << ",tox=" << r << ",toy=" << i << ",方框大小:" << r
|
|
|
<< endl;
|
|
|
Copy(0, r + i, r, i, r); //右上角复制到左下角
|
|
|
Print();
|
|
|
cout << "====================================" << endl;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
int main() {
|
|
|
int k;
|
|
|
cout << "请输入k的值:";
|
|
|
cin >> k;
|
|
|
|
|
|
//计算日程表
|
|
|
Table(k);
|
|
|
|
|
|
//输出表格
|
|
|
Print();
|
|
|
return 0;
|
|
|
} |