题目描述:
对于每一个正整数奇数n,输出一个n X n矩阵(奇数阶魔阵), 矩阵元素由1~n平方整数组成, 矩阵的每一行之和、每一列之和、主对角线之和均相等。要求使用动态存储分配。
输入描述:
正整数奇数n
输出描述:
每个阵列中整数占5位,每阵列输出阵列后输出一空行
输入样例:
3
输出样例:
8 1 6
3 5 7
4 9 2
——————————————————————————————————————
分析:
- 数字之间的规律
- “1”的初始位置
思路:
- “1”始终在第一行正中间
- 若一个数在第一行,下一个数在最后一行且列数加一
- 若一个数在最右侧,下一个数在最左侧且行数加一
- 一般情况,下一个数在上一个数右上
- 若应填的地方已经有数字或在方阵之外,则下一个数字就填在前一个数字的下方
(一般地,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 ,使用指针