魔方阵

将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("
");
        }
    }
}
原文地址:https://www.cnblogs.com/a863886199/p/9778490.html