谁有好办法找出所有四阶自然数幻方啊!

smdesker 2003-12-21 12:33:08
谁有好办法找出所有四阶自然数幻方啊!还有,四阶的到底有什么个有人知道吧。。。急啊。。。
...全文
51 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
smdesker 2003-12-27
  • 打赏
  • 举报
回复
找到yaos以前的贴子。。呵呵谢了。
/*我来贴一个我求4阶幻方总数的程序,运行结果7040*/

/*速度很快,用时不到1s*/

/*还有很大的优化余地*/



#include <stdio.h>



int p[100][4],l=0,t=0;

int q[4],p4[30][4];

long total=0;

int board[4][4];

unsigned long s[100];



void finalJudge()

{

int i,j,k,m,x,y;

for (i=0;i<24;i++)

{

for (j=0;j<24;j++)

{

for (k=0,x=0,y=0;k<4;k++)

{

x+=board[p4[i][k]][p4[j][k]];

y+=board[p4[i][3-k]][p4[j][k]];

}

if (x==34 && y==34)

{

total++;

for (k=0;k<4;k++,printf("\n"))

for (m=0;m<4;m++)

printf("%2d ",board[p4[i][k]][p4[j][m]]);

printf("\n");

}

}

}



}



void construct()

{

int i,j,k,m,x[4];

for (i=0;i<24;i++)

{

for (j=0;j<24;j++)

{

for (k=0;k<4;k++)

{

x[k]=34-p[q[0]][k]-p[q[1]][p4[i][k]]-p[q[2]][p4[j][k]];

board[3][k]=x[k];

if (x[k]<1 || x[k]>16 || !((1l<<(x[k]-1)) & s[q[3]])) break;

for (m=0;m<k;m++)

if (x[m]==x[k]) break;

if (m<k) break;

}

if (k==4)

{

for (k=0;k<4;k++)

board[0][k]=p[q[0]][k];

for (k=0;k<4;k++)

board[1][k]=p[q[1]][p4[i][k]];

for (k=0;k<4;k++)

board[2][k]=p[q[2]][p4[j][k]];

finalJudge();

}

}

}

}



void make(int b,int deep)

{

int i,j,sum;

if (deep>=4)

{

for (j=0,sum=0;j<4;j++)

sum+=(p[l+1][j]=p[l][j]);

if (sum==34)

{

for (j=0,s[l]=0;j<4;j++)

s[l]+=1l<<(p[l][j]-1);

l++;

}

return;

}

for (i=b;i<=16;i++)

{

p[l][deep]=i;

make(i+1,deep+1);

}

}



void makeP44(int deep){

int i,j,flag;

if (deep>=4)

{

for (j=0;j<4;j++)

p4[t+1][j]=p4[t][j];

t++;

return;

}

for (i=0;i<4;i++)

{

p4[t][deep]=i;

flag=1;

for (j=0;j<deep;j++)

if (p4[t][j]==i) flag=0;

if (flag) makeP44(deep+1);

}

}



void solve(int b,int deep)

{

int i,j,flag;

if (deep>=4)

{

construct();

return;

}

for (i=b;i<l;i++)

{

q[deep]=i;

flag=1;

for (j=0;j<deep;j++)

if (s[q[j]] & s[i]) flag=0;

if (flag) solve(i+1,deep+1);

}

}



main(){

/*freopen("1.txt","w",stdout);*/

make(1,0);

makeP44(0);

solve(0,0);

printf("total=%ld\n",total);

}
ilao 2003-12-23
  • 打赏
  • 举报
回复
好多E文!
呵呵
Linevan 2003-12-22
  • 打赏
  • 举报
回复
http://hades.ph.tn.tudelft.nl/Internal/PHServices/Documentation/MathWorld/math/math/m/m029.htm

有好的方法!
ZhangYv 2003-12-22
  • 打赏
  • 举报
回复
精华区有
ilao 2003-12-22
  • 打赏
  • 举报
回复
偶数的
的我也说不清楚
ilao 2003-12-22
  • 打赏
  • 举报
回复
奇数阶的是1在第一行中间
后2在最后一行对角向上排的
到右边后转下
下有数就转左
8 1 6
3 5 7
4 9 2
zalyer 2003-12-22
  • 打赏
  • 举报
回复
你去搜索一下一个叫"龙怪"的网站是一个台湾人搞的,就是对方阵的研究,有很多算法和奇妙的方阵.
yaos 2003-12-22
  • 打赏
  • 举报
回复
还要做一个纪录被使用的数字的模版,每组4个数字也纪录,用二进制与 很容易判断没有使用的数字
yaos 2003-12-22
  • 打赏
  • 举报
回复
比如:
(1,1)+(1,2)+(2,1)+(2,2) = (3,3)+(3,4)+(4,3)+(4,4)

等等
yaos 2003-12-22
  • 打赏
  • 举报
回复
880个

我在386上曾经作过,现在程序不知道扔到什么地方去了。 :)

很快的。不到10分钟。386sx25

现在的计算机,就更快了。

原理是:找到所有的4个数字组合等于(1+16)*16/2/4 = 34,一共1000多,然后
填出前两行,后边的用排除法,很容易填的

因为4阶的规律性太强了,要做做5阶的,很难。
smdesker 2003-12-21
  • 打赏
  • 举报
回复
大哥,我说是所有的啊。。。如何找出来才好。一二个的我多的是,我找了几千了。
还有谁知道总数是多少个啊。。。。可以再加分的。
ilao 2003-12-21
  • 打赏
  • 举报
回复
横向相加为15
纵向相加为15
对角相加为15
ilao 2003-12-21
  • 打赏
  • 举报
回复
四阶自然数幻方
为4*4啦
我写个3*3的
6 1 8
7 5 3
2 9 4
横纵向对角联合相加为15
ilao 2003-12-21
  • 打赏
  • 举报
回复
1 2 3 ............n*n
横纵向对角联合相加为
ns=n*n(n*n+1)/2
所以S=n(n*n+1)/2
这为阶

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧