魔方阵

魔方阵,又称幻方阵。是指组成元素为自然数1,2,3,4……n^2的n*n的方阵,其中每个元素都不相等,且每行、每列以及主、副对角线上哥哥n个元素之和都相等。分为三种情况:奇数魔方阵、单偶数魔方阵和双偶数魔方阵。

此博客只以奇数魔方阵为例,下面是算法描述

1、数字1放在方阵第一行中间位置;

2、当前数字存放在前一个数字的上一行后一列,注意如果已经到达顶行则上一行为最后一行即把线性的看成环形的,列同样处理;

3、如果当前位置有数据,则放在前一个数字的下一行,同列。

代码实现:

//奇数魔方阵
#include<stdio.h>
#include<assert.h>


#define ROW 3
#define COL ROW

int main()
{
	int arr[ROW][COL] = {0};
	assert((ROW%2) != 0);

	int arrrow = 0;
	int arrcol = (COL/2);

	/*数字1放在方阵第一行中间位置;*/
	arr[arrrow][arrcol] = 1; 

	for(int i = 2;i<= ROW*COL;i++)
	{
		/*
		环形处理方式:当前数字存放在前一个数字的上一行后一列,
		注意如果已经到达顶行则上一行为最后一行即把线性的看成环形的,列同样处理;
		*/
		arrrow = (arrrow-1+ROW)%ROW;
		/*
		或者   arrrow = (arrrow == 0)?ROW-1:arrrow-1;  
		再或者 arrrow--; if(arrrow<0) {  arrrow = ROW-1;}
		*/
		arrcol = (arrcol+1)%COL;

		 /*如果当前位置有数据,则放在前一个数字的下一行,同列。*/
		if(arr[arrrow ][arrcol] != 0) 
		{
			arrrow = (arrrow+2)%ROW;
			arrcol = (arrcol-1+COL)%COL;
		}
		arr[arrrow][arrcol] = i; 
	}

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

运行结果:

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值