a,b,c
d,e,f
g,h,i
a.b.c.d.e.f.g.h.i在是1—9之间的数不能重复
让连着的三个数加一起和等于15
这样做不对吗?
我很笨的只想到这个算法了
Private Sub Form_Load()
'a,b,c
'd,e,f
'g,h,i
For i = 1 To 9
For h = 1 To 9
For g = 1 To 9
For f = 1 To 9
For e = 1 To 9
For d = 1 To 9
For c = 1 To 9
For b = 1 To 9
For a = 1 To 9
If a + b + c = 15 And a + e + i = 15 And a + d + g = 15 _
   And b + e + h = 15 And _
   c + f + i = 15 And c + e + g = 15 And c + b + a = 15 _
    And d + e + f = 15 And g + h + i = 15 Then
Print a, b, c, d, e, f, g, h, i
End If
Next a
Next b
Next c
Next d
Next e
Next f
Next g
Next h
Next i
End Sub
用VB调试了可是总是死机,有没有好的算法呀`?!?

解决方案 »

  1.   

    我写一段代码,如下:
    Dim a, b, c
        For a = 1 To 9
            For b = a + 1 To 9
                For c = b + 1 To 9
                    If a + b + c = 15 Then
                        Label1.Caption = Label1.Caption + "{" + CStr(a) + "," + CStr _(b) + "," + CStr(c) + "}"
                    End If
                Next c
            Next b
        Next a
    运行结果是:
    {1,5,9}{1,6,8}{2,4,9}{2,5,8}{2,6,7}{3,4,8}{3,5,7}{4,5,6}
      

  2.   

    魔阵是用自然数1,2,3,...,n2 填n阶方阵的各个元素位置,使方阵的每行的元素之和、每列的元素之和及对角线元素之和均相等(亦称九宫图) .  奇数阶魔阵的一个算法是将自然数数列从方阵中间一行最后一个位置排起,每次总是向右下角排(即Aij
    的下一个是Ai+1,j+1).但若遇下述四种情况,则应修正排数法.
     
        1. 列排完(j=n+1),则转排第一列.
        2. 行排完(i=n+1),则转排第一行.
        3. 对Ann的下一个是An,n-1.
        4. 若Aij已排进一个自然数,则排进Ai-1,j-2 .例如 五阶方阵11    10   4    23   17
    18    12   6    5    24
    25    19   13   7     1
    2     21   20   14    8
    9     3    22   16    15
      上面给出了任意n阶奇数阶魔阵的求解规律,我想照这个规律写出算法,应该不是难事吧。:)
     
      有时候写程序往往容易造成思维定势,应学会利用数学的方法,或利用数学中已经验证过的公式或规律,这样写的程序效率要高很多。
      比如 要你写一个1+2+3+……n的算法,或许你会很不以为然的说:“这还不简单用一个循环
    for (i=1;i<=n;i++)
    { sum=sum+i;
     }
    但事实上这个算法的时间复杂度为n我要是这样写情况会是怎样呢?
     sum=1/2*(n+1)*n  
    时间复杂度为1 ,显然这样的程序的效率要比上面高很多。 
      

  3.   

    偶数阶很简单的。
    如4*4的。
    1   2   3   4
    5   6   7   8
    9  10  11  12
    13 14  15  16
    对角的数字换一下就行了。如:1和16换。
    最后是:
    16  2   3  13
    5  11  10   8
    9   7   6  12
    4  14  15   1
    偶数就复杂一点了。要画图了。
    如5*5的。
    1:
                               |    |
                         |    ||    ||    |
                   | 1  || 2  || 3  || 4  || 5  |
              |   || 6  || 7  || 8  || 9  || 10 ||   |
         |   ||   || 11 || 12 || 13 || 14 || 15 ||   ||   |
              |   || 16 || 17 || 18 || 19 || 20 ||   |
                   | 21 || 22 || 23 || 24 || 25 |
                         |    ||    ||    ||
                               |    |  
    2:
                               | 5  |
                         | 4  ||    || 10 |
                   | 3  ||    || 9  ||    || 15 |
              | 2 ||    || 8  ||    || 14 ||    || 20 |
         | 1 ||   || 7  ||    || 13 ||    || 19 ||    || 25  |
              | 6 ||    || 12 ||    || 18 ||    || 24 |
                   | 11 ||    || 17 ||    || 23 |
                         | 16 ||    || 22 ||
                               | 21 |  
    3:
    把数字移到对应的5*5方阵中间
    1移到13和19中间,25移到7和13中间,21移到9和13之间。
    4:搞定了。
    5:2n-1(n>0)的方阵可用上述方法。
    ps;上述方法不是唯一的,4*4的方阵就有4种。不过我都不记得了。
      

  4.   

    魔方问题,
    Private Sub Command1_Click()
     Dim input_i As Integer
     Dim i As Integer
     Dim n As Integer
     Dim r As Integer
     Dim c As Integer
     Dim m() As Integer
     Dim num As Integer
     Dim row As Integer
     Dim col As Integer
     input_i = InputBox("输入i")
     If input_i < 1 Then
         MsgBox "输入大于等于1的数"
     End If
     For n = 1 To input_i Step 2
      num = n * n
      ReDim m(n - 1, n - 1)
      row = 0
      col = (n - 1) / 2
      i = 1
      Do While (i <= num)
        If (row = -1) Then row = n - 1
        If (col = n) Then col = 0
        m(row, col) = i
        If (i Mod n) = 0 Then
          row = row + 1
         Else
          row = row - 1
          col = col + 1
        End If
         i = i + 1
     Loop
     Print
     Print "下面输入的是n="; n & "阶"
     For r = 0 To n - 1
       For c = 0 To n - 1
        Print Tab(c * 6); m(r, c);
       Next c
     Next r
     Next n
    End Sub
    Private Sub Form_Load()
     Timer1.Interval = 5000
    End Sub
    Private Sub Timer1_Timer()
     DoEvents
    End Sub
    这个是我写的<=i的数的组合,