扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
N介幻方的性质:每一行每一列以及每个对角线上的数之和相等,切都为N*(N*N+1)/2
专注于为中小企业提供做网站、网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业建湖免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上1000家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
设P[N*N]表示N*N方格
1.对于双偶数N(N%4==0)
(1)先画出N*N的方格
(2)在方格内从左到右,从上到下,依此填上1,2,...,N*N
(3)把N*N方格分成N*N/16个4*4的小方格
(4)画出各个4*4小方格的对角线
(5)各对角线上的数不变,非对角线上的数和它对称的数相互调换位置
即A和N*N-A+1对调.
好了,成功!
2. N%4==2
(1)把N*N个数的最前和最后的2N-2个数留下,其余数按 1 的方法填入
正中(N-2)*(N-2)个方格内.
(2)补上外方框
今天从0:00到3:00想出一个补法:
先填上几个特殊数
P[0]=3
P[N-1]=N
P[1]=1
P[N]=2
P[2]=N*N-3
P[3]=5
P[2N]=N+2
P[3N]=N+3
P[4]=N*N-5
下面再填入:
从P[5]到P[N-2]依此为7,8,N*N-8,N*N-9,11,12,N*N-12,N*N-13....
从P[4N]到P[(N-2)*N]依此为N*N-(N+3),N*N-(N+4),N+6,N+7,
N*N-(N+7),N*N-(N+8),N+10,N+11.........
再对称的补上其余.
、4M阶幻方和4M + 2阶幻方,其中M为自然数,2阶幻方不存在。幻方构造法主要有:连续摆数法、阶梯法(楼梯法)、奇偶数分开的菱形法、对称法、对角线法、比例放大法、斯特雷奇法、LUX法、拉伊尔法(基方、根方合成法)、镶边法、相乘法、幻方模式等。
奇数阶幻方构造法
Siamese方法(Kraitchik 1942年,pp. 148-149)是构造奇数阶幻方的一种方法,说明如下:
把1放置在第一行的中间。
顺序将等数放在右上方格中。
当右上方格出界的时候,则由另一边进入。
当右上方格中已经填有数,则把数填入正下方的方格中。
按照以上步骤直到填写完所有N2个方格。
(由于幻方的对称性,也可以把右上改为右下、左上以及左下等方位)
以5阶幻方为例,1填写在(1,3)(第一行第三列)的位置上;2应当填写在其右上方格即(0,4)中,由于(0,4)超出顶边界,所以从最底行进入,即(5,4);3填写在(5,4)的右上方格(4,5)中;4填写在(4,5)的右上方格(3,6)中,由于(3,6)超出右边界,所以从最左列进入,即(3,1);5填写在(3,1)的右上方格(2,2)中;6应该填写的方格(1,3)已经被1所占据,因此填写在(2,2)的正下方格(3,2)中;按照上面的步骤直到所有数填入。
偶数阶幻方构造法
4M阶幻方构造法
对于4M阶幻方一般都用对调法,制作起来很容易。如4阶幻方的排列法:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
按如上图排列好,再将非主副对角线上的各个数关于中心对调,即成下图:
1 15 14 4
12 6 7 9
8 10 11 5
13 3 2 16
4M+2阶幻方的求解方法
加边法
以6阶为例子,先排出4阶的幻方,如上图,再将图中每一个数都加上8m + 2 = 10
11 25 24 14
22 16 17 19
18 20 21 15
23 13 12 26
在外围加上一圈格子,把和这些数安排在外圈格子内,把1到8M+2和4m*4m+8m+3到(4m+2)*(4m+2)安排到外圈格子内,但要使相对两数之和等于16m(m + 1) + 5。
有了这些公式算法,我们就可以用程序语言来实现它了
首先,这是一个十阶的幻方也就是说我们要用4M+2阶幻方的模式来实现他,其中M=2;
并且要先求出4*2也就是8阶幻方,在把
下面是我编的C语言算法:
#include "stdio.h"
void mian()
{
int arr[10][10];
int no=1;
for(int i=1;i9;i++)
{
for(int j=1;j9;j++)
{
arr[i][j]=no;
no++;
}
}
for(int i=1;i5;i++)
{
for(int j=1;j9;j++)
{
if(i=j||i=(9-j))
contine;
else
{
int need=0;
need=arr[i][j];
arr[i][j]=arry[9-i][9-j];
arry[9-i][9-j]=need;
}
}
}
for(int i=1;i9;i++)
{
for(int j=1;j9;j++)
{
arr[i][j]=arr[i][j]+18;
}
}
int a[18],b[18];
int q=1,w=83;
for(int i=0;i18;i++)
{
a[i]=q;
b[i]=w;
q++;
w++;
}
for(int i=1;i9;i++)
{
for(int j=1;j9;j++)
{
if(j=8)
printf("%d\n",arr[i][j]);
else
printf("%d",arr[i][j])
}
}
for(int i=0;i18;i++)
{
printf("%d\n",a[i]);
printf("%d\n",b[i]);
}
}
因为我没有C编译器,所以我就只有这样把没检验过的代码给你了,我说明一下,我这个编译的是8*8的二维数组的幻方,公式也给你了,也许答案和你的不一样,但是绝对是正确的,楼主可以验算,至于为什么我没有加上其他二方,那是因为我暂时还没有想到有更优化的方法来实现4M+2种类的幻方方法,只能把他剩下的二方数字输出来,让别人自己填,我也就能做到这样了,打了大半天,虽说不完美,但是也只有将就了
另外,站长团上有产品团购,便宜有保证
不懂的话可以继续追问哈-----代码实现如下:
public class Test {
public static void init(int n){
int[][]yh = new int[n][2*n-1];
for(int i=0;iyh.length;i++){
//设置第一行的值
yh[0][n-1] = 1;
//设置最后一行两边的两个值
yh[n-1][0] = yh[n-1][2*n-2] = 1;
for(int j=0;ji;j++){
try{
//利用杨辉三角的性质进行逐行值的设置
//碰到下标溢出的情况不设置
yh[i][n-i-1+2*j]=yh[i][n+i-1-2*j]=yh[i-1][n-i-2+2*j]+yh[i-1][n-i+2*j];
}catch(Exception e){}
}
}
print(yh);
}
//进行数组的打印
public static void print(int[][]k){
for(int i=0;ik.length;i++){
for(int j=0;jk[i].length;j++){
if(k[i][j]!=0){
System.out.print(k[i][j]);
}else{
System.out.print(" ");
}
}
System.out.println();
}
}
public static void main(String[]args){
init(5);
}
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流