同遞歸版:給定 2ᵏ 名運動員,生成循環賽日程表。此處採用迭代(非遞歸)方式構造。
從 2×2 基礎表開始,每次將規模翻倍:
#include
#include
using namespace std;
void copyBlock(int** a, int sr, int sc, int dr, int dc, int k) {
for (int i = 0; i < k; ++i)
for (int j = 0; j < k; ++j)
a[dr+i][dc+j] = a[sr+i][sc+j];
}
void buildIter(int** a, int n) {
for (int s = 2; s <= n; s <<= 1) {
for (int j = 0; j < n; j += s) {
copyBlock(a, 0, j, s/2, j + s/2, s/2); // 左上→右下
copyBlock(a, 0, j + s/2, s/2, j, s/2); // 右上→左下
}
}
}
int main() {
int n; cin >> n; // n 應為 2 的冪
int** table = new int*[n];
for (int i = 0; i < n; ++i) {
table[i] = new int[n];
table[0][i] = table[i][0] = i + 1;
}
buildIter(table, n);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) cout << table[i][j] << ' ';
cout << endl;
}
return 0;
}
