奇数魔方阵

题目描述:

对于每一个正整数奇数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 
#include 
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 ,使用指针

你可能感兴趣的:(奇数魔方阵)