魔方阵是指它的每一行,每一列和对角线之和均相等。
魔方阵总共分为三类:
第一类:奇数类魔方阵
思路:
、 第一步:将第一个数放在第一行的中间(将1放在第一行中间)
第二步:将下一个数放在上一个数的上一行的右边的格子。
第三步:第二步中的那个格子有数字,那么将该数放在上一个数下一行的同列
例如:求5阶魔方阵
# include<stdio.h>
# include<assert.h>//断言
void MagicSquare()
{
#define ROW 5
#define COL ROW
int arr[ROW][COL]={0};//将二维数组先全部置为零
assert(ROW%2!=0);//判断是否为奇数方阵
arr[0][COL/2]=1;
int currow=0;
int curcol=COL/2;
for(int i=2;i<=ROW * COL;i++)
{
currow=(currow-1+ROW)%ROW;
curcol=(curcol+1)%COL;
if(arr[currow][curcol]!=0)//判断该格子是否被别的数占了。
{
currow=(currow+2)%ROW;
curcol=(curcol-1+COL)%COL;
}
arr[currow][curcol]=i;
}
for(int i=0;i<ROW;i++)
{
for(int j=0;j<COL;j++)
{
printf("% -3d ",arr[i][j]);
}
printf("\n");
}
}
int main()
{
MagicSquare();
return 0;
}
运行结果为:
第二类:能被4整除的魔方阵,比如,4阶,8阶,12阶.......
思路:
(1)先将整个方阵划分成k*k个4阶方阵,然后在每个4阶方阵的对角线上做记号
( 2)由左而右、由上而下,遇到没有记号的位置才填数字,但不管是否填入数字,每移动一格数字都要加1
(3)自右下角开始,由右而左、由下而上,遇到没有数字的位置就填入数字,但每移动一格数字都要加1
先以4阶魔方阵为例子;
以8阶魔方阵为例:
则代码为:
#include <stdio.h>
#include <assert.h>
#define N 4
void MagicSquare()
{
int i, j;
int arr[N+1][N+1] = {0};
assert(N%4==0);
for(j = 1; j <= N; j++)
{
for(i = 1; i <= N; i++)
{
if(j % 4 == i % 4 || (j % 4 + i % 4) == 1)
arr[i][j] = (N+1-i) * N -j + 1; //对角线上放的值
else
arr[i][j] = (i - 1) * N + j; //非对角线上放的值
}
}
for(i = 1; i <= N; i++)
{
for(j = 1; j <= N; j++)
printf("%-2d ", arr[i][j]);
printf("\n");
}
}
int main()
{
MagicSquare();
return 0;
}
运行结果为:
第三类:能被2整除的魔方阵,比如,2,4,6,8,10...
待续...........