魔方阵:由一组排放在正方形的整数组成,其每一行,每一列,及对角线上的数之和均相等;根据构造方法不同可以分为三类:奇数阶魔方阵,4M阶魔方阵和4M+2阶魔方阵
奇数阶魔方阵
构造方法:
1、将1放在第一行中间一列;
2、从2开始到n*n,每一个数存放的位置比前一个数的行数减1,列数加1即上一行下一列;
3、若上一行行数为1,下一个数的行数为n(n为最后一行或列),若上一个数的列数为n,下一个数的列数为1;
4、按照上述规则该位置已经有一个数,则放在上一个数的下一行同一列;
#include<stdio.h>
//3阶魔方阵
void MagicSquare()
{
#define ROW 3 //定义行列
int arr[ROW][ROW] = {0};
int currow = 0;
int curcol = ROW/2;
arr[currow][curcol] = 1;
//确定数字1的位置
for(int i=2;i<=ROW*ROW;i++)
{
currow = (currow-1+ROW)%ROW;
curcol = (curcol+1)%ROW;
//行减一列加一,同时保证行列值不为负且不大于总行数(列数)
if(arr[currow][curcol] != 0)
{
currow = (currow+1+1)%ROW;
curcol = (curcol-1+ROW)%ROW;
}
//当该位置已经有数时,放在上一个数的下一行同一列;第一个+1(-1)是与返回到上一个数
arr[currow][curcol] = i;
}
for(int i=0;i<ROW;i++)
{
for(int j=0;j<ROW;j++)
{
printf("%-3d",arr[i][j]);
}
printf("\n");
}
}
int main()
{
MagicSquare();
return 0;
}
4M阶魔方阵
构造方法:
1、将方阵划分成k*k个4阶方阵,每个4阶方阵的对角线上的位置进行标记;
标记的位置总结如下:
(1)左上到右下的对角线满足 i%4==j%4
(2)右上到坐下的对角线满足(i+j)%4=3
2、由上而下,从左至右,遇到没有标记的位置填数字(数字从1开始),否则不填,每移动一个格子数字加1
3、由上而下,从左至右,遇到标记的位置填数字(数字从4M*4M开始),否则不填,每移动一个格子数字加1
#include<stdio.h>
void MagicSquare()
{
#define ROW 8 //定义行列数
#define COL ROW
int arr[ROW][COL];
int tmp1 = 1;
int tmp2 = ROW*COL; //行列相乘,得出最大填入数
for(int i=0;i<ROW;i++)
{
for(int j=0;j<COL;j++)
{
if((i%4==j%4) || (i+j)%4==3)//标记的对角线的位置
{
arr[i][j] = tmp2; //从ROW*COL开始,遇到标记填入;
}
else
{
arr[i][j] = tmp1; //从1开始,遇到没有标记,填入;
}
tmp1++; //每移动加1,
tmp2--; //每移动减1,
}
}
for(int i=0;i<ROW;i++)
{
for(int j=0;j<COL;j++)
{
printf("%-4d",arr[i][j]);
}
printf("\n");
}
}
int main()
{
MagicSquare();
return 0;
}