我正在创建一个程序,它将在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
是随机洗牌列表,则函数需要非常长(有时超过一分钟),但通常会得到正确的回答。当order是从80到0的数字列表时,该函数不解决任何问题,并且总是返回false。
我试过单步执行代码但是使用递归函数很难。我想知道是否有人能看到我所犯的逻辑错误,谢谢!
答案 0 :(得分:1)
当订单是0到80的列表时,此功能按预期工作, 但是,如果order是随机洗牌列表,那么该函数需要 非常长(有时超过一分钟),但通常得到 正确答案。
原因可能是当递归树随着递归深度呈指数增长时,当您逐行处理数字时(而不是以随机顺序),大多数无效排列都会提前删除。您永远不必处理第二行,第一行不一致。
当订单是从80到0的数字列表时,该功能不会 解决任何事情,总是返回假。
一些建议:
1)尝试将order(i)
替换为80-i
,以确保问题不在order()
函数中;
2)每次拨打check_conflicts(board, order(i))
时,如果他们的结果不相同,也请致电check_conflicts(inverse(board), 80-order(i))
并抛出异常。