魔方阵

魔方阵:由一组排放在正方形的整数组成,其每一行,每一列,及对角线上的数之和均相等;根据构造方法不同可以分为三类:奇数阶魔方阵,4M阶魔方阵和4M+2阶魔方阵

奇数阶魔方阵

构造方法:

1、将1放在第一行中间一列;

2、从2开始到n*n,每一个数存放的位置比前一个数的行数减1,列数加1即上一行下一列;

3、若上一行行数为1,下一个数的行数为n(n为最后一行或列),若上一个数的列数为n,下一个数的列数为1;

4、按照上述规则该位置已经有一个数,则放在上一个数的下一行同一列;

#include<stdio.h>

//3阶魔方阵

void MagicSquare()
{
#define ROW 3               //定义行列
	int arr[ROW][ROW] = {0};
	int currow = 0;
	int curcol = ROW/2;
	arr[currow][curcol] = 1; 
	//确定数字1的位置
	for(int i=2;i<=ROW*ROW;i++)
	{
		currow = (currow-1+ROW)%ROW;
		curcol = (curcol+1)%ROW;    
		//行减一列加一,同时保证行列值不为负且不大于总行数(列数)
		if(arr[currow][curcol] != 0) 
		{
			currow = (currow+1+1)%ROW;
			curcol = (curcol-1+ROW)%ROW;
		}
		//当该位置已经有数时,放在上一个数的下一行同一列;第一个+1(-1)是与返回到上一个数
		arr[currow][curcol] = i;
	}

	for(int i=0;i<ROW;i++)
	{
		for(int j=0;j<ROW;j++)
		{
			printf("%-3d",arr[i][j]);
		}
		printf("\n");
	}
}

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

4M阶魔方阵

构造方法:

1、将方阵划分成k*k个4阶方阵,每个4阶方阵的对角线上的位置进行标记;

         标记的位置总结如下:

        (1)左上到右下的对角线满足 i%4==j%4

        (2)右上到坐下的对角线满足(i+j)%4=3

2、由上而下,从左至右,遇到没有标记的位置填数字(数字从1开始),否则不填,每移动一个格子数字加1

3、由上而下,从左至右,遇到标记的位置填数字(数字从4M*4M开始),否则不填,每移动一个格子数字加1

#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;      //从ROW*COL开始,遇到标记填入;
			}
			else
			{
				arr[i][j] = tmp1;     //从1开始,遇到没有标记,填入;
			}
			tmp1++;                  //每移动加1,
			tmp2--;                  //每移动减1,
		}
	}
	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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值