回溯算法_解数独2

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

 

posted @ 2022-12-05 10:39  依云科技  阅读(16)  评论(0)    收藏  举报