规律性递归
完整代码
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 void magic(int **pp, int n) 6 { 7 int i = 0; 8 //中间位置 9 int j = (n - 1) / 2; 10 int key = 1; 11 //定义第一个元素的值 12 pp[i][j] = key; 13 14 while (key < n*n) 15 { 16 //如果在右上边界,则下一个自增 17 if (i - 1 < 0 && j + 1 >= n) 18 { 19 i++; 20 pp[i][j] = ++key; 21 continue; 22 } 23 //如果在第一行,下一个数据跳到最后一行填充 24 if (i - 1 < 0) 25 { 26 i = n - 1; 27 } 28 //否则往上移一行 29 else 30 { 31 i--; 32 } 33 34 //如果在最后一列,下一个数据跳到第一列填充 35 if (j + 1 >= n) 36 { 37 j = 0; 38 } 39 //否则跳到下一列 40 else 41 { 42 j++; 43 } 44 45 //如果没有数据 46 if (pp[i][j] == -1) 47 { 48 //赋值 49 pp[i][j] = ++key; 50 } 51 //如果有数据则跳到下面两行,列数往前移动1 52 else 53 { 54 i += 2; 55 j--; 56 pp[i][j] = ++key; 57 } 58 } 59 } 60 61 62 63 64 void main() 65 { 66 int n; 67 scanf("%d", &n); 68 //n必须是基数 69 if (n % 2 == 0) 70 { 71 printf("无效"); 72 getchar(); 73 getchar(); 74 return; 75 } 76 77 //分块数组 78 int **pp = (int **)malloc(sizeof(int*)*n); 79 for (int i = 0; i < n; i++) 80 { 81 pp[i] = (int *)malloc(sizeof(int)*n); 82 } 83 84 //初始化 85 for (int i = 0; i < n; i++) 86 { 87 for (int j = 0; j < n; j++) 88 { 89 //数据清空 90 pp[i][j] = -1; 91 } 92 } 93 //计算 94 magic(pp, n); 95 //输出 96 for (int i = 0; i < n; i++) 97 { 98 for (int j = 0; j < n; j++) 99 { 100 //数据清空 101 printf("%3d", pp[i][j]); 102 } 103 printf(" "); 104 } 105 106 system("pause"); 107 }