构建一个高效的数独求解器

Jus*_*yer 6 java sudoku memory-efficient

是的,我知道这不是什么新鲜事,那里已经有很多问题(它甚至有自己的标签),但是我想用Java创建一个Sudoku Solver,仅仅是为了训练自己编写更多的代码.高效.

在程序中执行此操作的最简单方法可能是在每个列和行中分析大量的for循环,收集每个单元格的可能值,然后仅使用一种可能性清除单元格(无论它们是否只包含1个数字,或者它们是其行/列中唯一包含此数字的单元格,直到您有一个已解决的拼图.当然,纯粹想到这个动作应该会引起每个程序员的注意.

我正在寻找的是以最有效的方式解决这个问题的方法(请尽量不要包含太多的代码 - 我想自己想出那个部分).

如果可能的话,我想避免使用数学算法 - 那些太容易了,而且100%不是我的工作.

如果有人能够提供一个有效的思考过程来解决数独谜题(无论是通过人类还是计算机),我会非常高兴:).我正在寻找一些模糊的东西(所以这是一个挑战),但足够的信息(所以我并没有完全迷失)让我开始.

非常感谢,

Justian Meyer

编辑:

看看我的代码,我开始思考:存储这些求解状态(即数独网格)的可能性是什么.我想到了2D阵列和3D阵列.哪个可能最好?2D可能更容易从表面进行管理,但3D阵列也会提供"盒子"/"笼子"编号.

编辑:

没关系.我要去3D阵列.

Gil*_*anc 1

这取决于你如何定义高效。

您可以使用强力方法,该方法会搜索每一列和每一行,收集每个单元格的可能值,然后剔除只有一种可能性的单元格。

如果您的单元格仍具有多种可能性,请保存拼图状态,选择可能性最少的单元格,选择其中一种可能性,然后尝试解决拼图。如果您选择的可能性导致谜题矛盾,请恢复保存的谜题状态,返回单元格并选择不同的可能性。如果您选择的单元格中的所有可能性都无法解决难题,请选择可能性最少的下一个单元格。循环浏览剩余的可能性和单元格,直到解决了难题。

尝试解决这个难题意味着搜索每一列和每一行,收集每个单元格的可能值,然后淘汰只有一种可能性的单元格。当所有的细胞都被清除后,你就解决了这个难题。

您可以使用逻辑/数学方法,您的代码尝试不同的策略,直到解决难题。在 Google 上搜索“数独策略”以查看不同的策略。使用逻辑/数学方法,您的代码可以“解释”难题是如何解决的。