魔方阵

 魔方阵是指它的每一行,每一列和对角线之和均相等。

 魔方阵总共分为三类:

 第一类:奇数类魔方阵

        思路:

、      第一步:将第一个数放在第一行的中间(将1放在第一行中间)

          第二步:将下一个数放在上一个数的上一行的右边的格子。

          第三步:第二步中的那个格子有数字,那么将该数放在上一个数下一行的同列

例如:求5阶魔方阵

       

# include<stdio.h>
# include<assert.h>//断言
void MagicSquare()
{
#define ROW 5
#define COL ROW
	int arr[ROW][COL]={0};//将二维数组先全部置为零
	assert(ROW%2!=0);//判断是否为奇数方阵
	arr[0][COL/2]=1;
	int currow=0;
	int curcol=COL/2;
	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()
{
	MagicSquare();
	return 0;
}

运行结果为:


第二类:能被4整除的魔方阵,比如,4阶,8阶,12阶.......

          思路:

         (1)先将整个方阵划分成k*k个4阶方阵,然后在每个4阶方阵的对角线上做记号

        ( 2)由左而右、由上而下,遇到没有记号的位置才填数字,但不管是否填入数字,每移动一格数字都要加1 

        (3)自右下角开始,由右而左、由下而上,遇到没有数字的位置就填入数字,但每移动一格数字都要加1 

       先以4阶魔方阵为例子;

            


  以8阶魔方阵为例:

            

则代码为:

#include <stdio.h> 
#include <assert.h>
#define N 4

void MagicSquare()
{ 
    int i, j; 
    int arr[N+1][N+1] = {0}; 
	assert(N%4==0);
    for(j = 1; j <= N; j++)
	{ 

        for(i = 1; i <= N; i++)
		{ 
            if(j % 4 == i % 4 || (j % 4 + i % 4) == 1) 

                arr[i][j] = (N+1-i) * N -j + 1; //对角线上放的值

            else

                arr[i][j] = (i - 1) * N + j; //非对角线上放的值

        } 

    } 
	for(i = 1; i <= N; i++)
	{ 

        for(j = 1; j <= N; j++) 

            printf("%-2d ", arr[i][j]); 

        printf("\n"); 

    } 
} 
int main()
{
	MagicSquare();
	return 0;
}

运行结果为:

 

第三类:能被2整除的魔方阵,比如,2,4,6,8,10...

待续...........

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值