数独生成器算法

我做了一个生成sudokus的算法,但效率非常低。 每个难题都需要几分钟才能生成 所以现在我想以最佳方式再次编写它。 但我遇到了一些我需要帮助的问题。

  1. 有两个aproaches,从空白网格开始并添加数字,然后检查它是否可以解决。 第二种方法是创建包含所有81个数字的完整有效网格,然后删除,直到我们对剩余数字的数量感到满意并且它仍然可以解决。

首先我使用第一种方法,但现在我将使用第二种方法,因为我认为它更有效(我们从有效拼图开始,保证可以解决)。 我说第二种方法更好吗?

  1. 当我试图生成完全填充的网格时,我遇到了困难。 我的算法是:

    • 为每个细胞设置候选者。 最初他们是数字1到9。
    • 选择没有值的随机单元格。
    • 从该单元格中选择随机候选项并将其指定为单元格值。 其他候选人被丢弃。
    • 现在对于每一行,对应于指定单元格的单元格和正方形I从这些候选中移除单元格的值,因此每个数字在行/列/正方形中是唯一的
    • 重复

此技术保证随机网格没有重复的数字。 但是,大多数情况下,当我没有违反任何放置规则时就会发生冲突 – 比如所有候选人都被移除的空单元格,我需要重新开始。 有没有更优雅/有效的方法用数字填充整个网格而不破坏放置规则和仍然是随机数?

谢谢。

你看过现有的算法和/或代码吗?

查看http://www.sudokuwiki.org/Sudoku_Creation_and_Grading.pdf获取算法描述,以及Peter Norvig的文章http://norvig.com/sudoku.html 。

Python中有一些实现。 到目前为止,我从未见过已发布的C#解决方案。

祝好运!

如果您正在查看一些现有的算法,那么就有ac#项目。 这实际上来自与Peter Norvig相同的解决方案。 在这里阅读更多相关信息

希望这会有所帮助!

我使用编程来删除与最后一个条目冲突的所有先前条目。 使用这种方法,我可以输入一些数量并定期计算解决方案或输入整个网格。 我没有使用整个网格的随机输入,因为随机删除先前的条目可能会导致设置时间过长。 对于随机输入,我希望阻止输入冲突会导致空白单元格,因此答案可能是在删除先前冲突的条目时使用较长的设置。 您将需要返回所有空单元格,直到没有空单元格为止。 填充所有单元格后,解决方案必须有效,否则冲突将被删除。