一种简单的数独求解器java算法

一种简单的数独求解器java算法,java,algorithm,sudoku,Java,Algorithm,Sudoku,我已经在这件事上纠缠了一段时间了,我就是不能把我的头放在它上面。作为家庭作业,我必须为数独解算器生成一个算法,该算法可以检查一行、一列和一个块中空白正方形中的数字。这是一个普通的9x9数独游戏,我假设网格已经打印出来了,所以我必须在解决它的地方制作部分 我已经读了很多关于这个主题的东西,我只是无法表达出来 我希望解算器执行以下操作: 如果该值小于9,则将其增加1 如果值为9,则将其设置为零并返回1 如果该值无效,则增加1 我已经读过回溯之类的东西了,但我还处于课程的早期阶段,所以我想让它尽可

我已经在这件事上纠缠了一段时间了,我就是不能把我的头放在它上面。作为家庭作业,我必须为数独解算器生成一个算法,该算法可以检查一行、一列和一个块中空白正方形中的数字。这是一个普通的9x9数独游戏,我假设网格已经打印出来了,所以我必须在解决它的地方制作部分

我已经读了很多关于这个主题的东西,我只是无法表达出来

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

  • 如果该值小于9,则将其增加1
  • 如果值为9,则将其设置为零并返回1
  • 如果该值无效,则增加1
我已经读过回溯之类的东西了,但我还处于课程的早期阶段,所以我想让它尽可能简单

我更擅长用伪代码编写代码,但对算法本身就不太熟悉,而这正是本练习所需要的算法


提前感谢你们的帮助。

既然这是家庭作业,我相信我可以为你们指出大致的方向

首先,保留一个二维数组(或一个可以表示网格的数据结构),并跟踪可以到达那里的值。假设它是一个名为“可能性”的类:


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

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

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

然后,您将有一个名为
solve()
的递归函数,如果找到解决方案,该函数将返回true,否则将返回false。该函数将不断地将数字放在数独板的空单元格中(只有在它们不违反约束的情况下,我们假设您已经为其编写了算法),直到填充为止。填好后,谜题就解决了。你知道董事会是有效的,因为你一直在检查你在去那里的路上每个数字的有效性。如果在任何一点上都不能放置数字,它将返回false返回

solve的伪代码如下所示:

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

这是什么课?这看起来不像是编程入门课程的作业,除非你漏掉了很多细节。你试过big brother(又名google)吗?第一批热门歌曲之一是@mbeckish,它是java@Cherry-你最近在课堂上讲了什么?这应该给你一个关于他们正在寻找什么类型的解决方案的线索。例如,您是否介绍过递归?回溯算法?面向对象设计?@Cherry-既然这是家庭作业,我想最好的建议是让你和你的老师/助教谈谈。他们应该非常乐意为你指明正确的方向。正如其他人所说,您可以轻松地用谷歌搜索一个解决方案,但这样您就只能复制和粘贴代码,而您可能不理解其中的任何内容。这样做只会让你感到困惑,同时欺骗你的老师让你相信你不需要任何帮助。你甚至可能想要一个sudoko网格的专业课程,可以为一个块分配一个行和列编号,以及一个子块编号。这将使有效性检查更容易。@Rogue抱歉这个愚蠢的问题,但我可以用实际代码编写我的算法?@Cherry该算法或多或少是一个简单的1)迭代填充网格的内容2)当找到一个答案时,填充它3)迭代受影响的行以获得新答案,如果找到,重复2。4) repeat@Rogue这种算法在任何精心设计的谜题上都会失败。这里有一个例子。假设一行有三个空正方形,并且缺少数字1、4和6。第一个空正方形可以是1、4或6。其他两个正方形可以是4或6。1号去哪里?搜索单个答案方块是一种优化,而不是一种解决方案。
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