将1 ~ N(为奇数)的数字排列在N*N的方阵上,且各行、各列与各对角线的和必须相同,如下所示:
奇数魔方矩阵规律:
(1) 自然数1出现在第 1 行的正中间;
(2)若填入的数字在第-行(不在第 n 列),则下一个数字在第 n 行(最后一行)且列数加 1 (列数右移一列) ;
(3)若填入的数字在该行的最右侧,则下一个数字就填在,上一行的最左侧;
(4) 一般地,下一个数字在前一个数字的右上方(行数少 1,列数加 1 ) ;
(5)若应填的地方已经有数字或在方阵之外,则下一个数字就填在前一个数字的下方。 (一般地,n 的倍数的下一个数字是在该数的下方。)
代码如下:
①
#include<stdio.h>
#include<stdlib.h>
void oddmf(int n, int **square)
{
int i, j;
int key;
i = 1;
j = (n + 1) / 2;
square[i][j] = 1;
for(key=2; key<=n*n; key++)
{
i--;
j++;
if(i == 0)//越界检测
{
i = n;
}
if(j == n + 1)
{
j = 1;
}
if(square[i][j] != 0)//检测当前位置数字是否为0
{
i++;
}
square[i][j] = key;
}
}
int main()
{
int **square;
int key;
int i, j;
int n;
scanf("%d", &n);
square =(int**)malloc(sizeof(int*)*(n+1));//为二维数组申请动态分配内存
for(i=0; i<=n; i++)
{
square[i] = (int*)malloc(sizeof(int)*(n+1));
}
for(i=0; i<=n; i++)
{
for(j=0; j<=n; j++)//初始化数组
{
square[i][j] = 0;
}
}
oddmf(n, square);
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
printf("%3d",square[i][j]);
}
printf("\n");
}
return 0;
}
②
#include<stdio.h>
#include<stdlib.h>
void oddmf(int n, int **square)
{
int i, j;
int key;
i = 1;
j = (n + 1) / 2;
square[i][j] = 1;
for(key=2; key<=n*n; key++)
{
if(key % n == 1)//检测当前位置是否已填
{
i++;
}
else
{
i--;
j++;
}
if(i == 0)//越界检测
{
i = n;
}
if(j == n + 1)
{
j = 1;
}
square[i][j] = key;
}
}
int main()
{
int **square;
int key;
int i, j;
int n;
scanf("%d", &n);
square =(int**)malloc(sizeof(int*)*(n+1));//为二维数组申请动态分配内存
for(i=0; i<=n; i++)
{
square[i] = (int*)malloc(sizeof(int)*(n+1));
}
for(i=0; i<=n; i++)
{
for(j=0; j<=n; j++)//初始化数组
{
square[i][j] = 0;
}
}
oddmf(n, square);
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
printf("%3d",square[i][j]);
}
printf("\n");
}
return 0;
}
样例输出