基本算法简介(二)

Author: 黄陀 Date: 2001年 23期

#1?牐犛寐薏ü乖旎梅?
  ?牐牷梅绞且恢止阄鞔氖в蜗罚菟翟缭诖笥碇嗡本头⑾止;梅降奶氐闶牵河勺匀皇钩蒼×n正方形阵列,称为n阶幻方,每一行、每一列、两对角线上的数之和相等。法国人罗伯总结出了构造奇数阶连续自然数幻方的简单易行的方法“罗伯法”。下表就是一个用罗伯法排好的5阶幻方。(^23020501a^)
  ?牐犅薏ǖ木咛宸椒ㄈ缦拢?
  ?牐牥?1(或最小的数)放在第一行正中;
  ?牐牥匆韵鹿媛膳帕惺O碌膎2-1个数:
  ?牐?1)每一个数放在前一个数的右上一格;
  ?牐?2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
  ?牐?3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
  ?牐?4)如果这个数所要放的格已经超出了顶行且超出了最右列那么就把它放在前一个数的下一行同一列的格内;
  ?牐?5)如果这个数所要放的格已经有数填入,处理方法同4)。
  ?牐犞灰怯泄媛傻亩鳎扑慊苋菀拙涂梢宰龅健?
  ?牐犗旅嫖颐前崖薏ǚ氤杉扑慊惴ㄋ悸罚?
  ?牐牰ㄒ逡桓鰊×n数组;
  ?牐牥?1放在第0行第n\2列;
  ?牐犐璧鼻案裎╥,j),设一步长变量k(k=2->n*n)
  ?牐?1) i减1,j加1;
  ?牐?2) 如果i<0那么i=n-1;
  ?牐?3) 如果j>n-1那么j=0;
  ?牐?4) 如果2)和3)同时出现那么就把j减回1,i加上2;
  ?牐?5) 如果a(i,j)不为空那么按照4)处理;
  ?牐?6) 把k的值赋给当前格a(i,j);
  ?牐牸绦罚?
  ?牐犑涑龌梅秸蟆?
  ?牐犗旅媸荲B代码,在窗体上设置一Label标签框,标题设为空,AutoSize设为True。
  ?牐燨ption Explicit
  ?牐燚im i,j,n,k As Integer
  ?牐燚im a() As Integer
  ?牐燩rivate Sub Form_Load?煟?
  ?牐爊 = InputBox("输入幻方的阶数","幻方",3)
  ?牐燫eDim a(n,n) As Integer '定义动态数组
  ?牐燜or i = 0 To n - 1
  ?牐燜or j = 0 To n - 1
  ?牐燼(i,j) = 0 '初始化变量
  ?牐燦ext j
  ?牐燦ext i
  ?牐爅 = Int(n/2)
  ?牐燼(0,j) = 1 '1放在第一行正中
  ?牐燜or k = 2 To n ^ 2
  ?牐爄 = i - 1
  ?牐爅 = j + 1 '向右上方向填数
  ?牐營f i < 0 And j > n - 1 Then
  ?牐爄 = i + 2
  ?牐爅 = j - 1 '如果右上出界那么把下一个数放在前一个数的下方一格
  ?牐燛lse
  ?牐營f i < 0 Then i = n - 1 '如果上出界那么把下一个数放在上一列的底行
  ?牐營f j > n - 1 Then j = 0 '如果右出界那么把下一个数放在上一行的最左列
  ?牐燛nd If
  ?牐營f a(i,j) = 0 Then '如果将要排的位置还没有填数那么直接填数
  ?牐燼(i,j) = k
  ?牐燛lse '否则就把下一个数填在前一个数的下方的一格
  ?牐爄 = i + 2
  ?牐爅 = j - 1
  ?牐燼(i,j) = k
  ?牐燛nd If
  ?牐燦ext k
  ?牐燜or i = 0 To n - 1 '输出幻方
  ?牐燜or j = 0 To n - 1
  ?牐燣abel1.Caption = Label1.Caption + LTrim(Str(a(i,j)))+ "  "
  ?牐燦ext j
  ?牐燣abel1.Caption = Label1.Caption + Chr(13)
  ?牐燦ext i
  ?牐燛nd Sub
  ?牐牨敬朐赩B6调试通过。代码可在此下载http://go.163.com/~betterprogram。