魔方阵

今天上传下魔方阵

魔方阵是一个古老的智力问题,它要求在一个m×m的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如图1所示。
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11
图1 五阶魔方阵示例
②基本要求
 输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判断,如m有错,能给出适当的提示信息。
 实现魔方阵。
 输出魔方阵。

大致就是这样子

using namespace std;

int main()
{
    int m = 2;
    while (!(m % 2))
    {
        cout << "请输入奇数\n";
        cin >> m;
    };

    int x = 0, y = m / 2;

    int**mf;
    mf = new int *[m];
    for (int i = 0; i<m; i++)
    {
        mf[i] = new int[m];
    }


    for (int i = 0; i<m; i++)
        for (int j = 0; j<m; j++)
        {
            mf[i][j] = -1;
        }


    for (int i = 1; i <= m*m; i++)
    {
        if (mf[x][y] == -1)
        {
            mf[x][y] = i;
            x = (x - 1 + m) % m;
            y = (y - 1 + m) % m;
        }


        else
        {
            x = (x + 2) % m;
            y = (y + 1) % m;
            mf[x][y] = i;
            x = (x - 1 + m) % m;
            y = (y - 1 + m) % m;
        }
    }
    for (int i = 0; i<m; i++)
    {
        for (int j = 0; j<m; j++)
        {
            cout.setf(ios::left);
            cout.width(3);
            cout << mf[i][j] << " ";
        }
        cout << endl;
    }


    for (int i = 0; i < m; i++)
        delete[]mf[i];
    delete[]mf;

    system("PAUSE");
}


其实主要的问题个人认为有两个
一个是二维数组的动态声明

int**mf;
    mf = new int *[m];
    for (int i = 0; i<m; i++)
    {
        mf[i] = new int[m];
    }

这种就是先给一维的动态声明下 再对第二个维度动态声明下
其他的就没啥了吧

猜你喜欢

转载自blog.csdn.net/weixin_39722329/article/details/78307043