欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

构造奇数阶幻方

程序员文章站 2024-03-19 10:12:52
...

构造奇数阶幻方

什么是幻方

一个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:其实明白了思路很简单…
之前看到其他博主大量代码真头疼…自己写了一遍才发现并不难…

相关标签: C c语言 算法