将1填在方阵第一行的中间, 即(1, (n+1)/2)的位置
下一个数填在上一个数的主对角线的上方, 若上一个数的位置是(i,j), 下一个数应填在(i-1, j-1);
若应填写的位置下标出界, 则用用 n替代 即若i-1 == 0 , i = n., 即若j-1 == 0 ,j = n.,
若应填的位置没有出界, 但是有数据的话, 则应填在上一个数的下面 即取i1 = i+1, j1 = j
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int main() { int n; int arr[100][100]; while (scanf("%d", &n) != EOF) { memset(arr, 0, sizeof(arr)); int i = 1; int j = (n+1)/2; for (int k = 1; k <= n*n; k++) { arr[i][j] = k; int a = i; int b = j; i = i-1; j = j-1; if (i == 0) { i = n; } if (j == 0) { j = n; } if (arr[i][j] > 0) { i = a+1; j = b; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { printf("%4d ", arr[i][j]); } printf(" "); } } }