1.奇数幻方问题的解决方法:
算法:
1)将1填入第一行中间;
2)将每个数填在前一个数的右上方。
3)若该位置超出最上行,则改填在最下行的对应位置;
4)若该位置超出最右列,则该填在最左列的对应行位置;
5)若某元素填在第一行最右列,下一个数填在该数同列的下一行;
6)若某数已填好,但其右上角已填了其他数据,则下一个数填在该数同列的下一行位置。
程序见test17.c:
#include
#define N 5
void main()
{ int a[N][N]={0};
int k=1, m=0, n=N/2;
a[m][n]=k;
for(k=2; k<=N*N; k++)
{
m--,n++;
if (m==-1)
{
if (n==N)
{
m=1;
n=N-1;
}
else
m=N-1;
}
else
{
if (n==N)
n=0;
else
if (a[m][n])
{
m+=2;
n--;
}
}
a[m][n]=k;
}
for (m=0; m
putchar ('\n');
}
}
2. 偶数幻方算法:
2.偶阶幻方,n=2*(2m+1)
将幻方分成(2m+1)*(2m+1)的4个小幻方A、B、C、D,如图
A C
D B
记u=2m+1,将要填的数分为1~u^2,u^2+1~2*u^2,2*u^2+1~3*u^2,3*u^2+1~4*u^2,将这些数分别按奇阶幻方的填法填进A、B、C、D,然后将A中最左列除列中间的那个元素以外的元素与D中对应位置的元素交换;再将A中左起第2列至左起(u+1)/2-1列的诸元素与D中对应位置的元素交换;再将A中(u+1)/2行,(u+1)/2列的这个元素与D中对应位置的元素交换;最后将C中右起第1列到第(u-1)/2-1列的元素与B中对应位置的元素交换。
3.偶阶幻方,n=4*m
将1~n*n从1行1列开始按先行后列的顺序填进幻方,将幻方分成m*m个4*4的小幻方,去掉小幻方对角线上的数,然后将去掉的数按从大到小的顺序从1行1列开始按先行后列的填写顺序填进幻方。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21634752/viewspace-608347/ ,如需转载,请注明出处,否则将追究法律责任。