构造n阶幻方的算法

fzheng 2001-11-15 12:50:03
奇数阶的算法不难。

对于偶数阶的有些什么办法?利用状态空间搜索??

...全文
357 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
andrew80 2001-11-16
  • 打赏
  • 举报
回复
有现成的算法干吗搜索。

构造任意阶幻方的Pascal源程序

program MagicSquare;
const
n=100;
type
arr=array [1..n] of integer;
var
m,dgr,i,j,k,qut,half,tint:integer;
a,temp:array [1..n] of arr;
item1,item2:arr;
begin
writeln('Please enter the degree');
read(dgr);
if odd(dgr) {奇数阶幻方的劳伯尔法}
then begin
i:=1;
j:=(dgr+1) div 2; {设定起始位置}
for m:=1 to dgr*dgr do {填数}
begin
a[i,j]:=m;
if m mod dgr = 0 {右上对角有元素}
then i:=i+1
else begin {右上角没有元素}
i:=((dgr+i-2) mod dgr)+1;
j:=(j mod dgr)+1;
end;
end;
for i:=1 to dgr do {输出}
begin
for j:=1 to dgr do
write(a[i,j]:5);
writeln;
end;
readln;
end
else if odd(dgr div 2) {单偶阶幻方的斯特拉兹法}
then begin
m:=(dgr-2) div 4;
qut:=dgr*dgr div 4;
half:=dgr div 2;
i:=1; {用劳伯尔方法构造A部分}
j:=m+1;
for k:=1 to qut do
begin
a[i,j]:=k;
if k mod half = 0
then i:=i+1
else begin
i:=((half+i-2) mod half)+1;
j:=(j mod half)+1;
end;
end;
i:=half+1; {用劳伯尔方法构造B部分}
j:=half+m+1;
for k:=qut+1 to qut*2 do
begin
a[i,j]:=k;
if k mod half = 0
then i:=i+1
else begin
i:=half + ((half+i-2) mod half)+1;
j:=half + (j mod half)+1;
end;
end;
i:=1; {用劳伯尔方法构造C部分}
j:=half+m+1;
for k:=qut*2+1 to qut*3 do
begin
a[i,j]:=k;
if k mod half = 0
then i:=i+1
else begin
i:=((half+i-2) mod half)+1;
j:=half + (j mod half)+1;
end;
end;
i:=half+1; {用劳伯尔方法构造D部分}
j:=m+1;
for k:=qut*3+1 to qut*4 do
begin
a[i,j]:=k;
if k mod half = 0
then i:=i+1
else begin
i:=half + ((half+i-2) mod half)+1;
j:=(j mod half)+1;
end;
end;
for i:=1 to half do {交换A与D左侧边缘的m个格子}
for j:=1 to m do
if i <> m+1
then begin
tint:=a[i,j];
a[i,j]:=a[i+half,j];
a[i+half,j]:=tint;
end;
for j:=m+1 to 2*m do {交换A与D中间行的m个格子}
begin
tint:=a[m+1,j];
a[m+1,j]:=a[half+m+1,j];
a[half+m+1,j]:=tint;
end;
for j:=dgr downto dgr-m+2 do {交换B与C的右侧边缘的m-1列}
for i:=1 to half do
begin
tint:=a[i,j];
a[i,j]:=a[i+half,j];
a[i+half,j]:=tint;
end;
for i:=1 to dgr do {输出}
begin
for j:=1 to dgr do
write(a[i,j]:5);
writeln;
end;
end
else begin {双偶阶幻方的海尔法}
for i:=1 to dgr do {设定A与A′}
begin
item1[i]:=i;
item2[i]:=dgr+1-i;
end;
for i:=1 to (dgr div 2) do {填D1的上半部分}
if odd(i)
then a[i]:=item1
else a[i]:=item2;
for i:=dgr downto (dgr div 2 + 1) do {下半部分}
if odd(i)
then a[i]:=item2
else a[i]:=item1;
for i:=1 to dgr do{构造根数方阵并与初始方阵相加}
for j:=1 to dgr do
temp[i,j]:=(a[j,i]-1)*dgr+a[i,j];
for i:=1 to dgr do {输出}
begin
for j:=1 to dgr do
write(temp[i,j]:3,' ');
writeln;
end;
readln;
end;
end.
fzheng 2001-11-16
  • 打赏
  • 举报
回复
好感激!
starfish 2001-11-15
  • 打赏
  • 举报
回复
启发式搜索,你可以到www.google.com上搜索一下,国外有很多关于幻方的网站(搜索 magic square)
cleverbaby 2001-11-15
  • 打赏
  • 举报
回复
好像偶数阶的不都有解吧
fzheng 2001-11-15
  • 打赏
  • 举报
回复
搜索的话,采取怎样的策略呢?
starfish 2001-11-15
  • 打赏
  • 举报
回复
除了搜索没有好办法的

33,008

社区成员

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

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