#include using namespace std; #define N 50 //声明日程表安排函数 void GameTable(int k, int array[N][N]); //输出二维数组 void Print(int k, int array[N][N]); int main() { int k; int array[N][N]; cout << "****************************************" << endl; cout << "** 循环赛日程表 **" << endl; cout << "****************************************" << endl; cout << "设参赛选手的人数为n(n=2^k),请输入k 的值:" << endl; cin >> k; if (k != 0) { GameTable(k, array); Print(k, array); } else cout << "您输入的数据有误,请重新输入!" << endl; return 0; } //数组下标从1开始 void GameTable(int k, int array[N][N]) { int i, j, s, t; //个数 int n = 1 << k; //求总人数 for (i = 1; i <= n; i++) array[1][i] = i; //第一行排1-8 int m = 1; //用来控制每一次填表时i行j列的起始填充位置 //s指对称赋值的总循环次数,即分成几大步进行制作日程表 for (s = 1; s <= k; s++) { n = n / 2; for (t = 1; t <= n; t++) //t指明内部对称赋值的循环次数 for (i = m + 1; i <= 2 * m; i++) for (j = m + 1; j <= 2 * m; j++) { array[i][j + (t - 1) * m * 2] = array[i - m][j + (t - 1) * m * 2 - m]; //右上角等于左上角的值 array[i][j + (t - 1) * m * 2 - m] = array[i - m][j + (t - 1) * m * 2]; //左下角等于右上角的值 } m *= 2; } } //输出二维数组 void Print(int k, int array[N][N]) { int i, j; int num = pow(2, k); cout << num << "人的循环赛日程表如下" << endl; //输出二维数组 for (i = 1; i <= num; i++) { for (j = 1; j <= num; j++) { cout << array[i][j] << "\t"; } cout << endl; } cout.flush(); }