魔方阵问题的求解

魔方阵问题的分析与求解(以5阶为列)

一、定义
魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2、…、n2的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。
二、相关规则及其解法
1、规则一:将1放在第一行中间一列
魔方阵问题的求解
2、规则二:从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列)

*3、规则三:如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1

4、规则四:当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列*
以上三个规则的具体实现为:

方法一:
-魔方阵问题的求解
方法二:使用三目运算符计算
魔方阵问题的求解
方法三:将数组的行和列连接起来形成一个环
魔方阵问题的求解
5.规则五:如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面
魔方阵问题的求解
整个代码如下:
void MagicSquare()
{
#define SIZE 5
int arr[SIZE][SIZE]={0};
int currow=0;
int curcol=SIZE/2;
assert(SIZE%2 != 0);//奇数
arr[currow][curcol]=1;
for(int i=2;i<=SIZE*SIZE;i++)
{
currow=(currow-1+SIZE)%SIZE;
curcol=(curcol+1)%SIZE;
if(arr[currow][curcol]!=0)
{
currow=(currow+2)%SIZE;
curcol=(curcol-1+SIZE)%SIZE;
}
arr[currow][curcol]=i;
}
for(int i=0;i<SIZE;i++)
{
for(int j=0;j<SIZE;j++)
{
printf("%-3d",arr[i][j]);
}
printf("\n");
}
}
int main()
{
MagicSquare();
return 0;
}