|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
以下是我的智能算法代码:
九宫格数据填写在B2:J10的区域里。- Sub Answer()
- Dim A%, p%, t1, t2, Sj0, Sj1
- t1 = Timer
- Sj = [datas]
- Sj0 = Sj
- Do
- A = AllCross(Sj)
- If A = 81 Then
- [datas] = Sj
- t2 = Timer
- [p11] = t2 - t1
- 'MsgBox Format(t2 - t1, "0.000 S")
- Exit Sub
- ElseIf A = -1 Then
- Sj = Sj0
- p = p + 1
- GoTo ValidTest
- Else
- Sj1 = Sj
- p = 1
- ValidTest:
- If GetValid(Sj, p) = 0 Then
- Sj = Sj0
- p = p + 1
- GoTo ValidTest
- Else
- Sj0 = Sj1
- End If
- End If
-
- Loop
- End Sub
- Function AllCross(ByRef Sj As Variant) As Integer
- Dim i%, j%, K%, kk%, Sj1, GetSome As Boolean
- 'Sj = [datas]
- Do
- GetSome = False
- For kk = 1 To 9
- Sj1 = Sj
- For i = 1 To 9
- For j = 1 To 9
- If Sj(i, j) = kk Then
- For K = 1 To 9
- Sj1(i, K) = 1
- Sj1(K, j) = 1
- Sj1(((i - 1) \ 3) * 3 + 1 + (K - 1) \ 3, ((j - 1) \ 3) * 3 + 1 + (K - 1) Mod 3) = 1
- Next K
- ElseIf Sj(i, j) >= 1 And Sj(i, j) <= 9 Then
- Sj1(i, j) = 1
- End If
- Next j
- Next i
-
- For i = 1 To 9
- For j = 1 To 9
- If Sj1(i, j) = "" Then
- R = 0
- C = 0
- D = 0
- For K = 1 To 9
- R = R + Val(Sj1(i, K))
- C = C + Val(Sj1(K, j))
- D = D + Val(Sj1(((i - 1) \ 3) * 3 + 1 + (K - 1) \ 3, ((j - 1) \ 3) * 3 + 1 + (K - 1) Mod 3))
- Next K
-
- If R = 8 Or C = 8 Or D = 8 Then
- Sj(i, j) = kk
- GetSome = True
- End If
-
- End If
- Next j
- Next i
-
- Next kk
- Loop While GetSome
-
-
- For i = 1 To 9
- R = 0
- For j = 1 To 9
- If Len(Sj(i, j)) <> 1 Then
- GoTo RNext
- Else
- R = R + Sj(i, j)
- End If
- Next j
- If R <> 45 Then GoTo Ext
- RNext:
- Next i
-
- For i = 1 To 9
- C = 0
- For j = 1 To 9
- If Len(Sj(j, i)) <> 1 Then
- GoTo CNext
- Else
- C = C + Sj(j, i)
- End If
- Next j
- If C <> 45 Then GoTo Ext
- CNext:
- Next i
-
- For K = 0 To 8
- D = 0
- For i = 0 To 2
- For j = 0 To 2
- If Len(Sj(i + (K \ 3) * 3 + 1, j + (K Mod 3) * 3 + 1)) <> 1 Then
- GoTo DNext
- Else
- D = D + Sj(i + (K \ 3) * 3 + 1, j + (K Mod 3) * 3 + 1)
- End If
- Next j
- Next i
- If D <> 45 Then GoTo Ext
- DNext:
- Next K
-
- AllCross = 0
- For i = 1 To 9
- For j = 1 To 9
- If Len(Sj(i, j)) = 1 Then AllCross = AllCross + 1
- Next j
- Next i
- Exit Function
- Ext:
- AllCross = -1
- End Function
- Function GetValid(ByRef Sj As Variant, ByRef p As Integer) As Integer
- Dim i%, j%, K%, l&, S$, Sj1
- Sj1 = Sj
- l = 9
- For i = 1 To 9
- For j = 1 To 9
- If Sj(i, j) = "" Then
- S = "123456789"
- For K = 1 To 9
- S = Replace(S, Sj(i, K), "")
- S = Replace(S, Sj(K, j), "")
- S = Replace(S, Sj(((i - 1) \ 3) * 3 + 1 + (K - 1) \ 3, ((j - 1) \ 3) * 3 + 1 + (K - 1) Mod 3), "")
- Next K
-
- Sj1(i, j) = S
- If Len(S) = 0 Then Exit Function
-
- If Len(S) < l Then
- If Len(S) = 1 Then
- Sj(i, j) = S
- GetValid = 1
- Exit Function
- Else
- l = Len(S)
- End If
- End If
-
- End If
- Next j
- Next i
-
- For i = 1 To 9
- For j = 1 To 9
- If Len(Sj1(i, j)) = l Then
- Sj(i, j) = Mid(Sj1(i, j), p, 1)
- GetValid = p
- Exit Function
- End If
- Next j
- Next i
- GetValid = 0
- End Function
复制代码 代码注释就不给了。
|
|