分享

VB写数独解算器,附源码(转)

 战神之家 2014-04-05

'这个在窗体

Option Explicit
Dim Num(1 To 9, 1 To 9, 1 To 9) As String, Able(1 To 9, 1 To 9, 1 To 9) As Boolean
Private Sub cmdCls_Click()
Dim i As Integer, j As Integer, k As Integer
'变量清零
    For i = 1 To 9
        For j = 1 To 9
            For k = 1 To 9
                Num(i, j, k) = ""
                Able(i, j, k) = False
            Next k
        Next j
    Next i
      For i = 1 To 81
            NumIn(i).Text = ""
      Next i
End Sub

Private Sub CmdOk_Click()
Dim i As Integer, j As Integer, k As Integer
Dim X As Integer, Y As Integer, Z As Integer
Dim d1 As Integer, d2 As Integer, TN As String, TL As Integer
Dim Length As Integer, r As Integer
Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer, f As Integer
'变量清零
    For i = 1 To 9
        For j = 1 To 9
            For k = 1 To 9
                Num(i, j, k) = ""
                Able(i, j, k) = False
            Next k
        Next j
    Next i
'从Numin读值,并设置Able
    For i = 1 To 81
    Y = i Mod 9
    If i / 9 = 1 Or i / 9 = 2 Or i / 9 = 3 Or i / 9 = 4 Or i / 9 = 5 Or i / 9 = 6 Or i / 9 = 7 Or i / 9 = 8 Or i / 9 = 9 Then
      X = i / 9
    Else
      X = i \ 9 + 1
    End If
    If Y = 0 Then Y = 9
    Select Case X
        Case 1 To 3
            If Y <= 3 Then Z = 1
            If Y >= 4 And Y <= 6 Then Z = 2
            If Y >= 7 Then Z = 3
        Case 4 To 6
            If Y <= 3 Then Z = 4
            If Y >= 4 And Y <= 6 Then Z = 5
            If Y >= 7 Then Z = 6
        Case 7 To 9
            If Y <= 3 Then Z = 7
            If Y >= 4 And Y <= 6 Then Z = 8
            If Y >= 7 Then Z = 9
    End Select
    Num(X, Y, Z) = CStr(NumIn(i).Text)
    Able(X, Y, Z) = True
    Next i
'设其他值为1-9
For i = 1 To 9
      For j = 1 To 9
            For k = 1 To 9
                  If Num(i, j, k) = "" And Able(i, j, k) = True Then
                        Num(i, j, k) = "123456789"
                  End If
            Next k
      Next j
Next i
'计算
For r = 1 To 81
'删除同行列及方格中的数
For i = 1 To 9
      For j = 1 To 9
            For k = 1 To 9
                  If Able(i, j, k) = True Then
                  Length = Len(Num(i, j, k))
                  If Length = 1 Then
                        TN = Num(i, j, k)
                        For d1 = 1 To 9
                              For d2 = 1 To 9
                                    TL = Len(Num(i, d1, d2))
                                          If TL <> 1 And Able(i, d1, d2) = True Then
                                                Call DelNum(TN, Num(i, d1, d2))
                                          End If
                              Next d2
                        Next d1
                       
                        For d1 = 1 To 9
                              For d2 = 1 To 9
                                    TL = Len(Num(d1, j, d2))
                                          If TL <> 1 And Able(d1, j, d2) = True Then
                                                Call DelNum(TN, Num(d1, j, d2))

                                          End If
                              Next d2
                        Next d1
                       
                        For d1 = 1 To 9
                              For d2 = 1 To 9
                                    TL = Len(Num(d1, d2, k))
                                          If TL <> 1 And Able(d1, d2, k) = True Then
                                                Call DelNum(TN, Num(d1, d2, k))
                                          End If
                              Next d2
                        Next d1
                  End If
                  End If
            Next k
      Next j
Next i
'取唯一的可能值
For i = 1 To 9
      For X = 1 To 9
            For j = 1 To 9
                  For k = 1 To 9
                        If Able(i, j, k) = True Then
                              a = InStr(Num(i, j, k), CStr(X))
                                    If a <> 0 Then d = d + 1
                        End If
                        If Able(j, i, k) = True Then
                              b = InStr(Num(j, i, k), CStr(X))
                                    If b <> 0 Then e = e + 1
                        End If
                        If Able(j, k, i) = True Then
                              c = InStr(Num(j, k, i), CStr(X))
                                    If c <> 0 Then f = f + 1
                        End If
                  Next k
            Next j
            If d = 1 Then
                  For j = 1 To 9
                  For k = 1 To 9
                        If Able(i, j, k) = True Then
                        a = InStr(Num(i, j, k), CStr(X))
                              If a <> 0 Then
                                    Num(i, j, k) = CStr(X)
                              End If
                        End If
                  Next k, j
            End If
            d = 0
            If e = 1 Then
                  For j = 1 To 9
                  For k = 1 To 9
                        If Able(j, i, k) = True Then
                        b = InStr(Num(j, i, k), CStr(X))
                              If b <> 0 Then
                                    Num(j, i, k) = CStr(X)
                              End If
                        End If
                  Next k, j
            End If
            e = 0
            If f = 1 Then
                  For j = 1 To 9
                  For k = 1 To 9
                        If Able(j, k, i) = True Then
                        c = InStr(Num(j, k, i), CStr(X))
                              If c <> 0 Then
                                    Num(j, k, i) = CStr(X)
                              End If
                        End If
                  Next k, j
            End If
            f = 0
      Next X
Next i
Next r
'读出数据
    For i = 1 To 81
    Y = i Mod 9
    If i / 9 = 1 Or i / 9 = 2 Or i / 9 = 3 Or i / 9 = 4 Or i / 9 = 5 Or i / 9 = 6 Or i / 9 = 7 Or i / 9 = 8 Or i / 9 = 9 Then
      X = i / 9
    Else
      X = i \ 9 + 1
    End If
    If Y = 0 Then Y = 9
    Select Case X
        Case 1 To 3
            If Y <= 3 Then Z = 1
            If Y >= 4 And Y <= 6 Then Z = 2
            If Y >= 7 Then Z = 3
        Case 4 To 6
            If Y <= 3 Then Z = 4
            If Y >= 4 And Y <= 6 Then Z = 5
            If Y >= 7 Then Z = 6
        Case 7 To 9
            If Y <= 3 Then Z = 7
            If Y >= 4 And Y <= 6 Then Z = 8
            If Y >= 7 Then Z = 9
    End Select
      NumIn(i).Text = Num(X, Y, Z)
    Next i
End Sub

Private Sub Form_Load()
'以下用来产生格子
Dim MyTop As Integer, MyLeft As Integer                       'MyTop,MyLeft
Dim i As Integer, j As Integer, k As Integer, n As Integer                  'i,j,k
MyTop = 200
For i = 1 To 9
   MyLeft = 200
   For j = 1 To 9
      k = (i - 1) * 9 + j
      Load NumIn(k)
      NumIn(k).Text = NumIn(0).Text
            For n = 1 To 9
                NumIn(k).AddItem (CStr(n))
            Next n
      NumIn(k).Top = MyTop
      NumIn(k).Left = MyLeft
      NumIn(k).Visible = True
      NumIn(k).Enabled = True
      MyLeft = MyLeft + 1000
   Next j
MyTop = MyTop + 700
Next i

End Sub

'这个在模块

Sub DelNum(i As String, ByRef Num As String)
Dim n As String, m As String, k As Integer, l As Integer
k = InStr(Num, i)
      If k <> 0 Then
            n = Left(Num, k - 1)
            m = Mid(Num, k + 1)
            Num = n & m
      End If
End Sub

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多