回 帖 发 新 帖 刷新版面

主题:奇数阶偶数阶幻方通用程序!

[b][size=3]我今天终于编出了幻方(奇数阶偶数阶通用)程序!!!!![/size][/b]

因为奇数阶幻方课本上有介绍规律,所以编程起来比较容易;
不过我又发现了偶数阶的幻方的规律!
因为偶数阶幻方有这样一个规律——
比如说四阶,先把所有的按顺序填好。
 1  2  3  4
 5  6  7  8
 9 10 11 12
13 14 15 16
然后对角线的1,6,11,16,4,7,10,13不动
其他的和相对的数对调:2和15,3和14,5和12,9和8
最后答案就是:
 1 15 14  4
12  6  7  9
 8 10 11  5
13  3  2 16
可以先全部按顺序排好然后对调。
4阶幻方如下:
1,1  1,2  1,3  1,4
2,1  2,2  2,3  2,4
3,1  3,2  3,3  3,4
4,1  4,2  4,3  4,4
需要对调的是:
第一列有2,1——3,4
3,4=(1+2),(2+2)
3,1——2,4
2,4=(1+1),(3+1)
第二列有1,2——4,3
4,3=(2+2),(1+2)
4,2——1,3
1,3=(2+-1),(4+-1)
按半边算,先把i和j调换,然后要换的就是(j+x),(i+x)
x在第一列的第一行为3,每往下移一行就-1;
x在第二列的第一行为2,每往下移一行就-1。
其他偶数阶幻方也有这个特征。
程序如下:
CLS
DO
  INPUT n
LOOP UNTIL n > 2 AND n < 21
DIM a(n, n)
a$ = STRING$(LEN(STR$(n * n)), "#")
IF n MOD 2 <> 0 THEN
  p = n \ 2 + 1
  a(1, p) = 1
  i1 = 1
  j1 = p
  i = 1
  DO
    i2 = i1: j2 = j1
    i1 = i1 - 1
    IF i1 < 1 THEN i1 = n
    j1 = j1 + 1
    IF j1 > n THEN j1 = 1
    IF a(i1, j1) <> 0 THEN
      i1 = i2 + 1
      IF i1 > n THEN i1 = 1
      j1 = j2
    END IF
    i = i + 1
    a(i1, j1) = i
  LOOP UNTIL i = n * n
ELSE
  FOR i = 1 TO n
    FOR j = 1 TO n
      s = s + 1
      a(i, j) = s
    NEXT j
  NEXT i
  FOR j = 1 TO n / 2
    p = p + 1
    b = n - p
    FOR i = 1 TO n
      IF i <> j AND i + j <> n + 1 THEN
        SWAP a(i, j), a(j + b, i + b)
      END IF
      b = b - 1
    NEXT i
  NEXT j
END IF
FOR i = 1 TO n
  FOR j = 1 TO n
    PRINT USING a$; a(i, j);
  NEXT j
  PRINT
NEXT i
END

偶数阶幻方的规律是我花了很长时间才找到的,求大家多多表扬。。。

回复列表 (共1个回复)

沙发

厉害!楼主很强!
佩服!
牛!

我来回复

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