魔方(幻方)阵
解题思路:
魔方阵,又称幻方阵,是指组成元素为自然数 1、2,3…n^2 的 n×n 的方阵,其中每个元素值都不相等,且每行、每列以及主、副对
角线上各 n 个元素之和都相等。
对于 n 为奇数的魔方阵,算法描述如下:
1、数字 1 方阵方阵第一行的中间;
2、当前数字放在前一个数字的上一行,后一列,注意如果已经到
顶行则上一行为最后一行即把线性的看着环形的,列同样处理。
3、如果当前位置已经有数据,则放在前一个数字的下一行,同
列。
考点:
1、了解过魔方阵。
2、根据魔方阵的算法描述可以用编程语言实现。
//该函数只适合奇数的魔方阵
void MagicMatrix()
{
#define ROW 3
#define COL ROW
int arr[ROW][COL] = {0};
assert(ROW%2 != 0);//保证是奇数
int curRow = 0;
int curCol = COL/2;
arr[curRow][curCol] = 1;
for(int i=2; i<=ROW*COL; i++)
{
//线性数组进行环形处理,上一行,后一列。行和列的处理方式类
似,下面演示行的处理
//方法 1
curRow–;//
if(curRow < 0)
{
curRow = ROW-1;
}
//方法 2
//curRow = (curRow==0) ? ROW-1 : curRow-1;
//方法 3
//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("%2d “,arr[i][j]);
}
printf(”\n");
}}