数独求解/生成算法问题

时间:2014-02-23 13:18:08

标签: vb.net algorithm sudoku

我正在创建一个程序,它将在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。

我试过单步执行代码但是使用递归函数很难。我想知道是否有人能看到我所犯的逻辑错误,谢谢!

1 个答案:

答案 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))并抛出异常。