魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2、…、n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。
在本文中只讨论 n = 奇数
算法实现:
1.将数字 1 放在方阵第一行中间
2.当前数字放在前一个数字的上一行、后一列。如果已经到顶行或最后列则转到最后一行和第一列,即把线性数组看做环形数组
3.如果当前位置已有数据,则放在前一个数字的下一行,相同列
eg:当 n = 3 时 魔方阵如下 此时 每行和 = 每列和 = 对角线和
#include<stdio.h>
#include<assert.h>
#define ROW 3 //行数
#define COL ROW //列数 = 行数
void MagicMatrix()
{
int arr[ROW][COL] = { 0 };
assert(ROW % 2 != 0);//判断ROW为奇数
//放置数字 1
int currow = 0;
int curcol = COL / 2;
arr[currow][curcol] = 1;
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()
{
MagicMatrix();
}
运行结果: