魔方矩阵n=4k

如一个八阶魔方矩阵,分成四个四阶矩阵。

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;
}

运行结果如下图:

猜你喜欢

转载自blog.csdn.net/Dthinking/article/details/81167543