Private Function solveSudokuHelper(board) As Boolean
For i = 0 To 8
For j = 0 To 8
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_回溯算法_解数独1() '数组起始下标为0
tms = Timer '程序起始时间
With Sheet1
.Range("m1").CurrentRegion.ClearContents
ar = .Range("a1").CurrentRegion
Dim board(0 To 8, 0 To 8)
For x = 1 To UBound(ar)
For y = 1 To UBound(ar, 2)
board(x - 1, y - 1) = ar(x, y)
Next
Next
res = solveSudokuHelper(board)
.Range("m1").Resize(UBound(board) + 1, UBound(board, 2) + 1) = board
End With
MsgBox Format(Timer - tms, "0.0s ") & s
End Sub
Private Function isValidSudoku(row, col, Val, board) As Boolean
For i = 0 To 8
If board(row, i) = Val Then isValidSudoku = False: Exit Function
Next
For j = 0 To 8
If board(j, col) = Val Then isValidSudoku = False: Exit Function
Next
startrow = (VBA.Int(row / 3)) * 3
startcol = (VBA.Int(col / 3)) * 3
For i = startrow To startrow + 2
For j = startcol To startcol + 2
If board(i, j) = Val Then isValidSudoku = False: Exit Function
Next
Next
isValidSudoku = True
End Function