如一个八阶魔方矩阵,分成四个四阶矩阵。
1、从1开始从上往下从左往右依次填入数据,遇到对角线不填,但数字仍加一。如图1
2、从64开始也是从上往下从左往右依次填入数据,框内有数据的不填,但数字仍减一。如图二
图1:
图2:
问题的关键在于填不填人数据,即判断对角线的位置。
1、从左上到右下的对角线
第一条线:0,4 1,5 2,6 3,7 i+4=j
第二条线:0,0 1,1 2,2 3,3 4,4 5,5, 6,6 7,7 i=j
第三条线:4,0 5,1 6,2 7,3 i=j+4
得出左上右下对角线 i%4==j%4;
2、从右上到左下的对角线
第一条线:0,3 1,2 2,1 3,0 i+j=3
第二条线:7,0 6,1 5, 2 4,3 ,3,4 2,5 1,6 0,7 i+j=7
第三条线:4,7 5,6 6, 5 7,4 ( i+j)%4=3
得出右上左下对角线:(i+j)%4=3;
//左上到右下对角线满足i%4 == j%4
//右上到坐下对角线满足(i+j)%4 == 3
#include<stdio.h>
void MagicSquare()
{
#define ROW 8
#define COL ROW
int arr[ROW][COL];
int tmp1 = 1;
int tmp2 = ROW*COL;
for(int i=0;i<ROW;i++)
{
for(int j=0;j<COL;j++)
{
if((i%4==j%4) || (i+j)%4==3)//对角线
{
arr[i][j] = tmp2;
}
else
{
arr[i][j] = tmp1;
}
tmp1++;
tmp2--;
}
}
for(int i=0;i<ROW;i++)
{
for(int j=0;j<COL;j++)
{
printf("%-4d",arr[i][j]);
}
printf("\n");
}
}
int main()
{
MagicSquare();
return 0;
}
运行结果如下图: