构造奇数阶幻方

构造奇数阶幻方

什么是幻方

一个n*n的正方形矩阵
每一行/列以及对角线上各数之和相同

如何构造奇数阶幻方

1.第一个数 1 要放在第一行的中间
2.下一个数按走楼梯的方式向上

图片替换文本

3.超过行数/列数则循环摆放(类似于循环左右移的操作), 如下例 :

图片替换文本
图片替换文本

(这里2从上面超出了行,循环放到最下面去)
4.如果下一次填的位置已经被填过了,就放到上一次填的数的下方

图片替换文本

(填了5过后,6本该填到1的位置,但是既然已经填过了,所以就填到5的下方去)
5.继续循环走楼梯

实例

当n=5时, 应当构建的幻方结果如下:

  17 24 1  8  15
  23 5  7  14 16
  4  6  13 20 22
  10 12 19 21 3 
  11 18 25 2  9  
C语言实现
#include <stdio.h>
#include <stdlib.h>

main()
{
	int n=5;
	//也可以改为手动输入
	//printf("输入一个奇数:\n");
	//scanf("%d",&n);
	int sqrtn=n*n;
	int i,j,k;
	//为二维矩阵分配内存
	int** matrix=(int**) calloc(n,sizeof(int*));//分配一维矩阵内存
	for (i=0;i<n;i++) {
		matrix[i] = (int*) calloc(n,sizeof(int));//分配二维矩阵内存
	}
	//从第一行正中间开始填
	i=0;
	j=n/2;
	for(k=1;k<=sqrtn;k++) {
		matrix[i][j]=k;
		//走阶梯,这里超出行或列可以用模运算来做
		i=(i+n-1)%n;//这里加n是为了防止i=0时,i-1为负数
		j=(j+1)%n;
		//下一个要填的位置已经被填过了,处理一下
		if(matrix[i][j]>0) {
			i=(i+2)%n;//行调整为上一次填的数下方,刚刚上移了一行,这里就要下移2行
			j=(j+n-1)%n;//把刚才加的1列还原(就是不加)
		}
	}
	
	//打印二维数组
	for(i=0;i<n;i++) {
		for(j=0;j<n;j++) 
			printf("%d\t",matrix[i][j]);
		printf("\n");
	}
	
	//数组使用完毕后记得释放内存空间以避免内存泄漏
	for (i=0;i<n;i++) {
		free(matrix[i]);
	}
	free(matrix);
}

PS:其实明白了思路很简单…
之前看到其他博主大量代码真头疼…自己写了一遍才发现并不难…

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值