数独求解器java的简单算法

时间:2014-06-02 18:03:34

标签: java algorithm sudoku

我已经被困在这件事上一段时间了,我只是无法绕过它。对于家庭作业,我必须为数独求解器生成一个算法,该算法可以检查行中,列和块中的空白正方形中的数字。它是一个普通的9x9数独游戏,我假设网格已经打印出来,所以我必须生成它解决它的部分。

我已经阅读了很多关于这个主题的内容我只是被卡住了。

我希望解算器执行以下操作:

  • 如果该值小于9,则将其增加1
  • 如果值为9,则将其设置为零并返回1
  • 如果值无效,请增加1

我已经读过关于回溯的内容,但是我在课程的早期阶段就已经开始了,所以我想尽量保持简单。

我更有能力用伪代码编写,但不能用算法本身编写,而且这是本练习所需的算法。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

看到它的作业,我相信我可以指出你的大方向。

首先,保持二维数组(或可以表示网格的数据结构),并跟踪可以去那里的值。让我们说它是一个名为“可能性”的类:

public class Possibilities {

    //Keep track of the numbers possible internally, with an accessor

}

数独游戏的工作方式,通常会有一个只有一个答案的正方形(在某些情况下,这将无法使用,这意味着你需要潜在地复制数据并播放一点,或者有办法回滚)。简单地说,填写答案,然后迭代相邻的方块以删除新放的数字(并同时检查这些方格作为新的潜在答案)。

答案 1 :(得分:0)

我认为解决数独谜题的最简单算法是完整的搜索。也就是说,尝试每一个组合,直到找到一个有效的组合。实现它的最简单方法是递归。我知道你不想参与回溯,但我认为这是你写这个算法最简单的方法。

假设您已经有一个算法可以检查n是否可以进入您电路板(i, j)的某个单元格。这意味着n不违反任何约束(每行,列和框中只能有1到9个数字)。这不应该太难,您只需循环遍历包含单元格(i, j)的行,列和框,并确保n尚未显示。

然后,您将拥有一个名为solve()的递归函数,如果找到解决方案将返回true,否则返回false。该函数将不断将数字放在数独板的空单元格中(只有当它们没有违反约束时,我们假设您已经编写了算法),直到它被填充为止。一旦填满,拼图就会解决。你知道董事会是有效的,因为你一直在检查你在那里的每个号码的有效性。如果在任何时候都不能放置任何数字,它将通过返回false来回溯。

求解的伪代码看起来像这样:

boolean solve()
    if the board is filled
        return true

    for each cell that is not empty
        for n = 1 .. 9
            if n does not exist in this row, column and box
                place n in this cell
                if solve()
                    return true
                remove n from this cell
    return false