#include using namespace std; //目标:理解递归,思考怎样把问题分解为更小的同样的问题 int A[1000][1000]; int i, j; //很显示这是一个递归的函数,要深入理解递归 void solve(int n) { if (n == 1) { A[0][0] = 1;//递归边界,标记好第一个元素 } else { int m = n / 2;//划分为四块后,每块的边长为原来的一半 //求解左上角 solve(m); for (i = m; i < n; i++)//左下角可由左上角对应的每个数加边长得到 for (j = 0; j < m; j++) A[i][j] = A[i - m][j] + m; for (i = 0; i < m; i++)//右上角可由左下角复制而得到 for (j = m; j < n; j++) A[i][j] = A[i + m][j - m]; for (i = m; i < n; i++)//右下角可由左上角复制而得到 for (j = m; j < n; j++) A[i][j] = A[i - m][j - m]; } } int main() { int k; cin >> k; //求解边长为n(2的k次幂)的循环日程表 int n = 1 << k; //主函数调用 solve(n); //输出结果 for (int i = 0; i < n; i++, printf("\n")) for (int j = 0; j < n; j++) printf("%3d", A[i][j]); return 0; }