幻方算法的所有情况描述及C语言表示 2019-03-30
讨论幻方前,先讨论一下动态申请数组大小
众所周知 在C语言中必须指定数组的大小 否则会报错。如果你不知道你要申请多大的数组怎么办?初始化一个非常大的数组?显然浪费空间。。
头文件#include 为我们提供了malloc函数 即动态内存分配函数 我们可以用它来为我们分配我们想要的数组大小
你想分配一个自己键盘输入大小的数组 就用malloc函数来实现(以下代码都用伪代码表示)
本题的申请数组就将用到这个方法
1.int *arr;//声明一个指针变量
scanf("%d",&n);
a=(int *)malloc(sizeof(int)*n);//这样就新建了一个长度为n的一维数组
2.int **arr;//声明一个二级指针 即指向指针的指针
scanf("%d",&n);
arr = (int **)malloc(sizeof(int*)*n);//申请一个n*n的二维数组
for (i = 0;i < n;i++)
arr[i] = (int *)malloc(sizeof(int)*n);
一、幻方按照阶数可分成了三类,即奇数阶幻方、双偶阶幻方(n%4==0)、单偶阶幻方(n-2%4==0)
奇数阶幻方(劳伯法)
奇数阶幻方最经典的填法是罗伯法。填写的方法是:
把1(或最小的数)放在第一行正中;按以下规律排列剩下的(n×n-1)个数:
(1)每一个数放在前一个数的右上一格;
(2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
(3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
(4)如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在底行且最左列;
(5)如果这个数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内。
例,用该填法获得的5阶幻方:
二、双偶数阶幻方(海尔法)
所谓双偶阶幻方就是当n可以被4整除时的偶阶幻方,即4K阶幻方。在说解法之前我们先说明一个“互补数”定义:就是在n阶幻方中,如果两个数的和等于幻方中最大的数与1的和(即n×n+1),我们称它们为一对互补数。如在三阶幻方中,每一对和为10的数,是一对互补数 ;在四阶幻方中,每一对和为17的数,是一对互补数。
双偶数阶幻方最经典的填法是海尔法。填写的方法是:
以8阶幻方为例:
(1)先把数字按顺序填。然后,按4×4把它分割成4块(如图)
(2)每个小方阵对角线上的数字