首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查数独字段的一个很酷的算法?

检查数独字段的一个很酷的算法?
EN

Stack Overflow用户
提问于 2008-11-14 08:56:23
回答 24查看 71.3K关注 0票数 25

有没有人知道一个简单的算法来检查数独配置是否有效?我想出的最简单的算法是(对于大小为n的棋盘)用伪代码

代码语言:javascript
复制
for each row
  for each number k in 1..n
    if k is not in the row (using another for-loop)
      return not-a-solution

..do the same for each column

但我非常确定一定有更好的(在更优雅的意义上)解决方案。效率并不重要。

EN

回答 24

Stack Overflow用户

回答已采纳

发布于 2008-11-14 09:26:52

您需要检查数独的所有约束:

  • 检查每行的总和
  • 检查每列的总和
  • 检查每个框的总和
  • 检查每行的重复数字
  • 检查每列的重复数字
  • 检查每个框的重复数字

总共有6张支票..使用暴力手段。

如果您知道电路板的大小(即3x3或9x9),则可以使用某种数学优化

编辑:对sum约束的解释:首先检查sum (如果sum不是45,则停止)比检查重复要快得多(也更简单)。它提供了一种丢弃错误解决方案的简单方法。

票数 25
EN

Stack Overflow用户

发布于 2008-11-14 10:33:33

Peter Norvig有一篇关于解决数独难题(使用python)的很好的文章,

https://norvig.com/sudoku.html

也许这对你想做的事情来说太多了,但不管怎样,这都是一本很棒的书

票数 24
EN

Stack Overflow用户

发布于 2009-04-29 12:22:40

检查每一行、每一列和每一个框,使其包含数字1-9,没有重复。这里的大多数答案已经讨论了这一点。

但是如何有效地做到这一点呢?答案:使用循环,如下所示

代码语言:javascript
复制
result=0;
for each entry:
  result |= 1<<(value-1)
return (result==511);

每个数字将设置结果的一位。如果所有9个数字都是唯一的,则将设置最低的9位。因此,“检查重复项”测试只是检查所有9位都已设置,这与测试result==511相同。你需要做27次这样的检查。每行、每列和每框一个。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/289537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档