[VBA][遞迴]解數獨

[VBA][遞迴]解數獨

 

 

注意..VBA Function 參數如沒特定宣告預設會使用Call ByRef

Dim isDone As Boolean
Sub sudo()

sudoary = 工作表2.Range("B2:J10").Value
isDone = False
工作表2.Range("B2:J10") = solution(sudoary, 1, 1)
End Sub


Function solution(ByVal sudoary, ByVal cx, ByVal cy)

If (cx > 9) Then
    cx = LBound(sudoary, 1)
    cy = cy + 1
End If


If (cx > 9 Or cy > 9) Then
    solution = sudoary
    isDone = True
    Exit Function
End If

If (sudoary(cy, cx) <> "") Then
    solution = solution(sudoary, cx + 1, cy)
Else
    For n = 1 To 9
        If (Check(sudoary, n, cx, cy) = False) Then
            sudoary(cy, cx) = n
            solution = solution(sudoary, cx + 1, cy)
        End If
        
        If (isDone) Then
            Exit Function
        End If
    Next
End If


End Function

Function Check(ByVal ary, num, cx, cy)

x = getLbound(cx)
y = getLbound(cy)
'檢查小方格
For i = y To y + 2
    For j = x To x + 2
        If (ary(i, j) = num) And (i <> cy And j <> cx) Then
            Check = True
            Exit Function
        End If
    Next
Next




'檢查縱向 檢查橫向
For i = 1 To 9
        If (ary(i, cx) = num) And i <> cy Or _
            (ary(cy, i) = num) And i <> cx Then
            Check = True
            Exit Function
        End If
Next i

Check = False

End Function

Function getLbound(num)


Select Case num
	Case 1, 2, 3
    	getLbound = 1
	Case 4, 5, 6
    	getLbound = 4
	Case 7, 8, 9
    	getLbound = 7
	Case Else
    	getLbound = 1
	End Select

End Function