[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