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调试了可是总是死机,有没有好的算法呀`?!?
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调试了可是总是死机,有没有好的算法呀`?!?
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}
的下一个是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 ,显然这样的程序的效率要比上面高很多。
如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种。不过我都不记得了。
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的数的组合,