美文网首页
奇数魔方阵

奇数魔方阵

作者: 板混DK | 来源:发表于2017-09-28 12:01 被阅读0次

    题目描述:

    对于每一个正整数奇数n,输出一个n X n矩阵(奇数阶魔阵), 矩阵元素由1~n平方整数组成, 矩阵的每一行之和、每一列之和、主对角线之和均相等。要求使用动态存储分配。

    输入描述:

    正整数奇数n

    输出描述:

    每个阵列中整数占5位,每阵列输出阵列后输出一空行

    输入样例:

    3

    输出样例:

    8 1 6
    3 5 7
    4 9 2
    ——————————————————————————————————————

    分析:

    1. 数字之间的规律
    2. “1”的初始位置

    思路:

    1. “1”始终在第一行正中间
    2. 若一个数在第一行,下一个数在最后一行且列数加一
    3. 若一个数在最右侧,下一个数在最左侧且行数加一
    4. 一般情况,下一个数在上一个数右上
    5. 若应填的地方已经有数字或在方阵之外,则下一个数字就填在前一个数字的下方
      (一般地,n+1个数是在n的下方)

    代码:

    #include <iostream>
    #include <cstring>
    using namespace std;
    void DisplayMatrix (int *A, int n);
    
    int main()
    {
        int *A ;
        int  n;
        cin >> n;
        //申请一个n*n个int元素的内存空间并初始化
        A = new int [n*n];
        memset (A, 0, n*n*sizeof (int));
    
        //开始赋值
        int i, j;
        i = 0; j = n/2;
        for (int r=1;r<=n*n;r++)
        {
            A[i*n+j]=r;
            if (r%n == 0)
            {
                if (i == (n-1)) i=0;
                else i++;
            }
            else
            {
                if (i == 0) i=n-1;
                else i--;
    
                if (j==(n-1)) j=0;
                else j++;
            }
        }
    
    
    
        //打印方阵归还空间
        DisplayMatrix (A, n);
        delete [] A;
        return 0;
    
    }
    
    void    DisplayMatrix (int *A, int n)
    {
        for (int i =0; i <= (n-1); ++i) {
            for (int j = 0; j <= (n-1); ++j) {
                cout.width (5);
                cout << A [i*n+j];
            }
            cout << endl;
        }
    }
    

    小结:

    • 注意动态分配使用结束时释放空间
    • memset (A, 0, nnsizeof (int)); 记得初始化数组的格式,即对sizeof(int)的使用
    • 一维数组A[NN]的下标从0到NN-1, 循环中关于 i 和 j 的初始值应从0开始,或者
    • 在必要的地方 -1 ,否则有溢出的风险
    • cout.width (5);
    • void DisplayMatrix (int *A, int n); 申明函数时记得 *A ,使用指针

    相关文章

      网友评论

          本文标题:奇数魔方阵

          本文链接:https://www.haomeiwen.com/subject/tpumextx.html