我已经被困在这件事上一段时间了,我只是无法绕过它。对于家庭作业,我必须为数独求解器生成一个算法,该算法可以检查行中,列和块中的空白正方形中的数字。它是一个普通的9x9数独游戏,我假设网格已经打印出来,所以我必须生成它解决它的部分。
我已经阅读了很多关于这个主题的内容我只是被卡住了。
我希望解算器执行以下操作:
我已经读过关于回溯的内容,但是我在课程的早期阶段就已经开始了,所以我想尽量保持简单。
我更有能力用伪代码编写,但不能用算法本身编写,而且这是本练习所需的算法。
提前感谢您的帮助。
答案 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