【算法之美-经典问题】九宫格问题

【算法之美-经典问题】九宫格问题

题目

九宫格是一种古老的数学游戏,它要求在3X3的矩阵中,填入1-9这9个数字,并且横向、纵向、斜向上的3个数字之和皆相等。类似问题在数学上被称为幻方。现将九宫格推广到5X5,7X7等幻方问题。根据求解口诀““一居上行正中央,依次斜填切莫忘;上出框时向下放,右出框时向左放;排重便在下格填,右上排重一个样”。所谓一居上行正中央说的是1在第一行的正中,依次 斜填切莫忘说的是一直向右上方填, 上出框时往下填是斜填到方框上面去了,就放在这竖行的最下边, 右出框时左边放是说斜填到右框外面,就在横行左边放, 排重便在下格填是斜填上面有数字了,就在自己的下面放, 右上排重一个样就是右上格上面没有格子了,就和排重一样,放在自己的下面。

根据一个用户输入的奇数,作为幻方矩阵的大小输出一个对应的矩阵。

解答

#include <iostream>
#include <memory>
#include <iomanip>
using namespace std;

int main(){
    int n;
    cin >> n;
    cout << endl;

    int **a = new int *[n];
    for (int i = 0; i < n; i++)
    {
        a[i] = new int [n];
        memset(a[i], 0, n * sizeof(int));
    }

    int row = 0, col = n / 2;
    for (int i = 1; i <= n*n; i++)
    {
        a[row][col] = i;
        row--;
        col++;
        if (row < 0 && col >= n)
        {
            row += 2;
            col--;
        }
        else if (row < 0)
        {
            row = n - 1;
        }
        else if (col >= n)
        {
            col = 0;
        }
        if (a[row][col] != 0)
        {
            row += 2;
            col--;
        }
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << setw(6) << a[i][j] << " ";
        }
        cout << endl;
    }

    for (int i = 0; i < n; i++)
    {
        delete[] a[i];
    }
    delete[] a;
    return 0;
}

测试结果

5

    17     24      1      8     15
    23      5      7     14     16
     4      6     13     20     22
    10     12     19     21      3
    11     18     25      2      9
请按任意键继续. . .
    原文作者:九宫格问题
    原文地址: https://blog.csdn.net/sps900608/article/details/52389129
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞