我正在創建一個程序,它將在vb.net中生成數獨遊戲,並且由於我這樣做的方式,我需要它來解決棋盤位置(以特定的隨機方式訪問單元格順序),然後再以相反的順序解決。我正在使用遞歸求解器。Sudoku解決/生成算法問題
這是我與工作的代碼:
Public Function solve(ByRef board() As Integer) As Boolean
For i = 0 To 80
If board(order(i)) = 0 Then
For j = 1 To 9
board(order(i)) = j
If check_conflicts(board, order(i)) = False Then
If solve(board) = True Then
Return True
End If
End If
Next
board(order(i)) = 0
Return False
End If
Next
Return True
End Function
其中check_conflicts
是確定特定小區分配是否直接與板相沖突的函數(因此板被傳遞和細胞order(i)
的索引也通過了)。當order
是0到80的列表時,該功能按預期工作,但如果order
是一個隨機洗牌列表,則該函數需要非常長的時間(有時會超過一分鐘),但通常會得到正確的答案。當order是從80到0的數字列表時,該函數不會解決任何問題,並且總是返回false。
我嘗試了單步執行代碼,但使用遞歸函數很困難。我想知道是否有人能看到我所做的邏輯錯誤,謝謝!
感謝您的回覆,我嘗試了您的建議,並意識到它無法倒退的原因是由於約束集中的錯誤使得難題變得不可能。我懷疑這個算法天生就很慢,我猜想我需要實現一些優化 – maxG795