所谓“n-魔方阵”,指的是使用1〜n2共n2个自然数排列成一个n×n的方阵,其中n为奇数;该方阵的每行、每列及对角线元素之和都相等,并为一个只与n有关的常数,该常数为n×(n2+1)/2。
假定阵列的行列下标都从0开始,则魔方阵的生成方法为:
在第0行中间置1,对从2开始的其余n2-1个数依次按下列规则存放:
(1) 假定当前数的下标为(i,j),则下一个数的放置位置为当前位置的右上方,即下标为(i-1,j+1)的位置。
(2) 如果当前数在第0行,即i-1小于0,则将下一个数放在最后一行的下一列上,即下标为(n-1,j+1)的位置。
(3) 如果当前数在最后一列上,即j+1大于n-1,则将下一个数放在上一行的第一列上,即下标为(i-1,0)的位置。
(4) 如果当前数是n的倍数,则将下一个数直接放在当前位置的正下方,即下标为(i+1,j)的位置。
#include<stdio.h>
#include<assert.h>
#define SIZE 5
void MagicSquare()
{
int arr[SIZE][SIZE] = {0};
int currow = 0;
int curcol = SIZE/2;
assert(SIZE%2 != 0);//1奇数
arr[currow][curcol] = 1; //2
for(int i=2;i<=SIZE*SIZE;i++)
{
//currow--;//上一行 1
//if(currow < 0)
//{
// currow = SIZE-1;
//}
//currow = (currow==0 ? SIZE-1 : currow-1);//2
currow = (currow-1+SIZE)%SIZE;//3
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;
}
例如“5-魔方阵”,程序输出结果如下: