回 帖 发 新 帖 刷新版面

主题:幻方一解

program whb(input,output);
var k,i,j,n:integer;
    a:array[0..100,0..100]of integer;
    f:array[0..100,0..100]of boolean;
begin
    write('please input an odd number:');
    readln(n);
    for i:=0 to n do
    for j:=0 to n do
       
    f[i,j]:=false;
    f[0,0]:=true;
    i:=1;j:=n div 2+1;
    a[i,j]:=1;f[i,j]:=true;
    for k:=2 to sqr(n) do
       begin
           if (i=1) and (j<>1) then
                               begin
                               i:=n;
                               j:=j-1;
                               end
           else if  (j=1) and (i<>1) then
                               begin
                               i:=i-1;
                               j:=n;
                               end
                else
                begin
                i:=i-1;
                j:=j-1;
                if f[i,j]=true then begin
                                    i:=i+2;
                                    j:=j+1;
                                    end
                end;
          a[i,j]:=k;
          f[i,j]:=true;



       end;
       for i:=1 to n do
       begin
       for j:=1 to n do
       write(a[i,j]:3);
       writeln;
       end;

end.
说明:此题用的是楼梯法。。具体说明见幻方构造。

回复列表 (共3个回复)

沙发

不错啊!我有点小建议:

看数组:a:array[0..100,0..100]of integer;好理解。
但是看f:array[0..100,0..100]of boolean;这个数组好象没有必要设定。

按程序的意思:
f[i,j] 表示: a[i,j]这一个格子填了没有。如果f[i,j]=true 表示a[i,j]填了,反之是没有。

不用f数组,其实也很好认:
一开始,数组a里的每个数,都是0,(赋初值)
因为幻方不可能填个数字0进去,所以:
a[i,j]=0时:a[i,j]这一格没有填过
a[i,j]<>0时:a[i,j]这一格已经填过了。

板凳

兄弟你比我高

3 楼

不错。。高手就是高手。这个想法很好,,我怎么没有想到呢??

我来回复

您尚未登录,请登录后再回复。点此登录或注册