求一个《百子回归图》的算法,代码可以是C#,VB,JAVA或者C语言。

算法是一个10*10的二维数组,行相加的和=列相加的和=对角列相加的和,希望可以用代码输出,图如下:

根据构造方法的不同,幻方可以分成三类:奇数阶幻方、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;i<9;i++)
{
for(int j=1;j<9;j++)
{
arr[i][j]=no;
no++;
}
}
for(int i=1;i<5;i++)
{
for(int j=1;j<9;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;i<9;i++)
{
for(int j=1;j<9;j++)
{
arr[i][j]=arr[i][j]+18;
}
}
int a[18],b[18];
int q=1,w=83;
for(int i=0;i<18;i++)
{
a[i]=q;
b[i]=w;
q++;
w++;
}

for(int i=1;i<9;i++)
{
for(int j=1;j<9;j++)
{
if(j=8)
printf("%d\n",arr[i][j]);
else
printf("%d",arr[i][j])
}
}
for(int i=0;i<18;i++)
{
printf("%d\n",a[i]);
printf("%d\n",b[i]);
}
}

因为我没有C编译器,所以我就只有这样把没检验过的代码给你了,我说明一下,我这个编译的是8*8的二维数组的幻方,公式也给你了,也许答案和你的不一样,但是绝对是正确的,楼主可以验算,至于为什么我没有加上其他二方,那是因为我暂时还没有想到有更优化的方法来实现4M+2种类的幻方方法,只能把他剩下的二方数字输出来,让别人自己填,我也就能做到这样了,打了大半天,虽说不完美,但是也只有将就了
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-05
#include <stdio.h>

int main()
{
int arr[10][10]=
{
{82,25,29,89,100,13,52,70,10,35},
{84,75,41,17,18,87,40,48,57,38},
{81,93,53,24,86,26,85,39,03,15},
{33,76,9,54,16,14,61,59,92,91},
{45,64,01,78,19,99,22,60,43,74},
{67,63,96,47,12,20,27,42,73,58},
{05,66,55,11,97,49,98,62,30,32},
{8,34,90,83,46,68,56,04,95,21},
{6,7,80,37,88,79,28,77,31,72},
{94,2,51,65,23,50,36,44,71,69},
};
int i=0;
int j=0;
int crossValue1=0;
int crossValue2=0;
for(i=0; i<10; i++)
{
int rowValue=0;
int colValue=0;
for(j=0; j<10; j++)
{
rowValue += arr[i][j];
colValue += arr[j][i];
if(i==j)
crossValue1 += arr[i][j];
if(i+j==9)
crossValue2 += arr[i][j];
}
printf("第%d行:\t\t%d\n",i+1,rowValue);
printf("第%d列:\t\t%d\n",i+1,colValue);
}
printf("左上右下:\t%d\n",crossValue1);
printf("左下右上:\t%d\n",crossValue2);
return 0;
}
输出效果:
第1行: 505
第1列: 505
第2行: 505
第2列: 505
第3行: 505
第3列: 505
第4行: 505
第4列: 505
第5行: 505
第5列: 505
第6行: 505
第6列: 505
第7行: 505
第7列: 505
第8行: 505
第8列: 505
第9行: 505
第9列: 505
第10行: 505
第10列: 505
左上右下: 505
左下右上: 505
毕业后从事网站开发,已经好久没写C的代码了,呵呵,不知道是不是你要的效果
第2个回答  2011-03-05
如果说构造幻方 是可以用构造实现的 具体方法可以查查资料吧
http://blog.sina.com.cn/s/blog_49051c63010002un.html
这上面有很多幻方的知识
第3个回答  2011-03-05
是要通过程序创建这样一个数组吗?

还是说仅仅计算这些东西相加的和?。请补充
第4个回答  2011-03-05
不好意思我表示不懂