我做了一个算法来生成数独,但它的效率非常低。每个谜题都需要几分钟才能生成。所以现在我正在尝试以最佳方式再次编写它。但是我遇到了一些需要帮助的问题。
有两种方法:
- 从空白网格开始并添加数字,然后检查它是否可以解决。
- 创建包含所有 81 个数字的完整有效网格,然后删除,直到我们对剩余数字的数量感到满意并且它仍然可以解决。
首先我使用第一种方法,但现在我将使用第二种方法,因为我认为它更有效(我们从保证可解决的有效难题开始)。我是对的,第二种方法更好?
当我试图生成完整的填充网格时,我遇到了困难。我的算法是:
- 为每个单元格设置候选者。最初它们是数字 1 到 9。
- 选择没有值的随机单元格。
- 从该单元格中选择随机候选并将其分配为单元格值。其他候选人被丢弃。
- 现在对于与分配的单元格对应的每一行、单元格和正方形,我从这些候选者中删除单元格的值,因此每个数字在行/列/正方形中都是唯一的
- 重复
这种技术保证随机网格没有重复的数字。然而,大多数时候,当我不违反任何放置规则时,就会发生冲突——比如所有候选人都被删除的空单元格等,我需要重新开始。有没有更优雅/有效的方法来用数字填充整个网格而不破坏放置规则和仍然是随机数?