把日程表分裂成四个规模更小的问题 先分裂 再复制
#include <iostream>
#include <cmath>
using namespace std;
#define SIZE 128
int arr[SIZE][SIZE];
int n;
// 生成循环赛日程表的函数
void TournamentSchedule(int ti, int tj, int size) {
if (size == 1)
return;
int s = size / 2;
TournamentSchedule(ti, tj, s); // 左上角
TournamentSchedule(ti, tj + s, s); // 右上角
TournamentSchedule(ti + s, tj, s); // 左下角
TournamentSchedule(ti + s, tj + s, s); // 右下角
// 填充右下角到左上角
for (int i = 0; i < s; i++) {
for (int j = 0; j < s; j++) {
arr[ti + s + i][tj + s + j]=arr[ti + i][tj + j];
}
}
// 填充左下角到右上角
for (int i = 0; i < s; i++) {
for (int j = 0; j < s; j++) {
arr[ti + s + i][tj + j]=arr[ti + i][tj + s + j];
}
}
}
int main() {
cout << "请输入 k 的值:" << endl;
int k;
cin >> k;
n = pow(2, k);
// 初始化数组
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = 0;
}
}
// 填充数组的第一行
for (int i = 1; i <= n; i++) {
arr[0][i - 1] = i;
}
// 生成循环赛日程表
TournamentSchedule(0, 0, n);
// 输出结果
cout << "\n生成的循环赛日程表如下:" << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << arr[i][j] << "\t";
}
cout << endl;
}
return 0;
}