Private Function solveSudokuHelper(board) As Boolean
For i = 1 To 9
For j = 1 To 9
If (board(i, j) = ".") Then
For k = 1 To 9
If isValidSudoku(i, j, k, board) Then
board(i, j) = k
If solveSudokuHelper(board) Then solveSudokuHelper = True: Exit Function
board(i, j) = "."
End If
Next
solveSudokuHelper = False: Exit Function
End If
Next
Next
solveSudokuHelper = True
End Function
Sub h21_回溯算法_解数独2() '数组起始下标为1
tms = Timer '程序起始时间
With Sheet1
.Range("m12").CurrentRegion.ClearContents
ar = .Range("a12").CurrentRegion
Call solveSudokuHelper(ar)
.Range("m12").Resize(UBound(ar), UBound(ar, 2)) = ar
End With
MsgBox Format(Timer - tms, "0.0s ") & s
End Sub
Private Function isValidSudoku(row, col, Val, board) As Boolean
For i = 1 To 9
If board(row, i) = Val Then isValidSudoku = False: Exit Function
Next
For j = 1 To 9
If board(j, col) = Val Then isValidSudoku = False: Exit Function
Next
startrow = getInt(row / 3) * 3
startcol = getInt(col / 3) * 3
For i = startrow + 1 To startrow + 3
For j = startcol + 1 To startcol + 3
If board(i, j) = Val Then isValidSudoku = False: Exit Function
Next
Next
isValidSudoku = True
End Function
Function getInt(x)
If x <= 1 Then
x = 0
ElseIf x > 1 And x <= 2 Then
x = 1
ElseIf x > 2 And x <= 3 Then
x = 2
End If
getInt = x
End Function