魔方阵,又称幻方阵。是指组成元素为自然数1,2,3,4……n^2的n*n的方阵,其中每个元素都不相等,且每行、每列以及主、副对角线上哥哥n个元素之和都相等。分为三种情况:奇数魔方阵、单偶数魔方阵和双偶数魔方阵。
此博客只以奇数魔方阵为例,下面是算法描述:
1、数字1放在方阵第一行中间位置;
2、当前数字存放在前一个数字的上一行后一列,注意如果已经到达顶行则上一行为最后一行即把线性的看成环形的,列同样处理;
3、如果当前位置有数据,则放在前一个数字的下一行,同列。
代码实现:
//奇数魔方阵
#include<stdio.h>
#include<assert.h>
#define ROW 3
#define COL ROW
int main()
{
int arr[ROW][COL] = {0};
assert((ROW%2) != 0);
int arrrow = 0;
int arrcol = (COL/2);
/*数字1放在方阵第一行中间位置;*/
arr[arrrow][arrcol] = 1;
for(int i = 2;i<= ROW*COL;i++)
{
/*
环形处理方式:当前数字存放在前一个数字的上一行后一列,
注意如果已经到达顶行则上一行为最后一行即把线性的看成环形的,列同样处理;
*/
arrrow = (arrrow-1+ROW)%ROW;
/*
或者 arrrow = (arrrow == 0)?ROW-1:arrrow-1;
再或者 arrrow--; if(arrrow<0) { arrrow = ROW-1;}
*/
arrcol = (arrcol+1)%COL;
/*如果当前位置有数据,则放在前一个数字的下一行,同列。*/
if(arr[arrrow ][arrcol] != 0)
{
arrrow = (arrrow+2)%ROW;
arrcol = (arrcol-1+COL)%COL;
}
arr[arrrow][arrcol] = i;
}
for(int i = 0;i<ROW;i++)
{
for(int j = 0;j<COL;j++)
{
printf("%3d",arr[i][j]);
}
printf("\n");
}
return 0;
}
运行结果: