Я создаю программу, которая будет генерировать головоломки судоку на vb.net, и из-за того, как я это делаю, мне нужно, чтобы она решала позицию доски (доступ к ячейкам в определенном случайном порядке), а затем снова решала ее в обратный порядок. Для этого я использую рекурсивный решатель.
Это код, с которым я работаю:
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
- это случайно перемешанный список, тогда функция занимает невероятно много времени (иногда более минуты), но обычно получает правильный ответ. Когда порядок представляет собой список чисел от 80 до 0, функция ничего не решает и всегда возвращает false.
Я пробовал пройти через код, но с рекурсивной функцией это сложно. Интересно, может ли кто-нибудь увидеть мою логическую ошибку, спасибо!