生成一个所需难度的数独?

Zac*_*lms 7 puzzle sudoku

所以,我已经完成了对数独谜题生成的一些阅读.据我所知,具有所需难度的数独谜题的标准方法是生成谜题,然后对其进行评分,并重复直到您具有可接受的评级之一.这可以通过使用一些更复杂的解决模式(XY翼,箭鱼等)生成回溯来改进,但这不是我想要在这里做的.

我想做的,但一直无法找到任何真正的资源,是从"难度值"生成一个谜题(0-1.0值,0是最简单的,1.0是最难的).

例如,我想创建一个中等难度的谜题,因此选择值.675.现在使用该值我希望能够产生一个中等难度的谜题.

有人知道这样的事吗?或者也许有类似方法的东西?

Nik*_* M. 5

添加另一个答案,用于即时生成所需难度的数独。

这意味着与其他方法不同,该算法仅运行一次并返回与所需难度匹配的数独配置(在一定范围内的概率较高或概率=1

生成(和评级)数独难度的各种解决方案都与基于人类的技术和方法有关,可以轻松评级。

然后(在生成数独配置之后)使用类人求解器重新求解数独,并根据求解器使用的技术(例如pairsx-wingswordfish等)还分配难度率。

这种方法的问题 (以及我的用例的要求)

  1. 为了生成给定难度的数独,使用以前的方法需要求解数独两次(一次使用基本算法,一次使用类人求解器)。

  2. 人们必须(预)生成许多数独,只有在类人解算器解决后才能将其评定为难度。因此,人们无法一次性生成所需的数独。

  3. 类人求解器可能很复杂,并且在大多数情况下(如果不是全部)与 9x9 数独网格紧密耦合。因此不能简单地推广到其他数独(例如 4x4、16x16、6x6 等)

  4. 类人技术的难度等级是非常主观的。例如,为什么X 翼被认为比隐藏单打更难?(个人手动解决了许多困难的已发表的数独难题,但从未使用过此类技术)

使用了另一种方法,该方法具有以下优点:

  1. 可以很好地推广到任意数独(9x9、4x4、6x6、16x16 等)
  2. 具有所需难度的数独配置一次性生成并即时生成
  3. 难度等级是客观的。

怎么运行的?

首先,一个简单的事实是,谜题越困难,需要解决的时间就越多

但要解决的时间与线索(给定)的数量和每个空单元格要研究的平均替代方案密切相关。

扩展我之前的答案,有人提到,对于任何数独谜题,最小线索数是谜题的客观属性(例如,对于 9x9 网格,有效数独的最小线索数是 17

人们可以从那里开始计算每个难度级别的最小线索数(线性相关)。

此外,在数独生成过程的每一步中,我们都可以确保每个空单元格的平均替代方案(待研究)在给定范围内(作为所需难度的函数)

根据算法是否使用回溯(对于所讨论的用例,算法不回溯),可以以概率 = 1 或在边界内高概率(分别)达到所需的难度。

使用该算法生成的数独和基于先前方法(类人求解器)的难度评级的测试显示了期望难度率和估计难度率的相关性,以及对任意数独配置的更强泛化能力。

(已使用此在线数独求解器(以及)来关联测试数独的难度率)

该代码可在 github 上免费获得 sudoku.js(以及示例演示应用程序),它是 CrossWord.js 的缩小版,是 JavaScript 中的专业填字游戏生成器,由同一作者编写


Bri*_*y37 2

它并不像您要求的那么优雅,但您可以通过缓存模拟此行为:

  1. 决定拼图需要多少个“桶”。例如,假设您选择 20。因此,您的存储桶将包含不同难度范围的谜题:0-.05、.05-.1、.1-.15、..、.9-.95、.95- 1
  2. 生成一个谜题
  3. 给拼图评分
  4. 将其放入适当的桶中(或当桶满时将其扔掉)
  5. 重复直到你的水桶被“填满”。存储桶的大小及其存储位置将取决于您的应用程序的需求。

然后,当用户请求某个难度的谜题时,从他们选择的存储桶中为他们提供一个缓存的谜题。您可能还需要考虑交换数字并更改具有已知难度的谜题的方向,以生成具有相同难度级别的类似谜题。然后,当您需要用新拼图重新装满水桶时,请根据需要重复上述操作。