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

时间:2012-05-07 20:33:22

标签: puzzle sudoku

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

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

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

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

4 个答案:

答案 0 :(得分:3)

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

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

用于生成(和评级)数独难度的各种解决方案与human-based techniques and approaches有关,可以轻松评级。

然后一个(在生成数独配置之后)使用类似人类的解算器重新解析数独,并且取决于解算器使用的技术(例如 pair x-wing 箭鱼等)也分配了难度率。

此方法的问题 (以及我用过的用例的要求)

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

  2. 必须(预)生成许多只能被人类解算器解析后难度的sudokus。因此,人们无法一次性生成所需的数独。

  3. 人类解算器可能很复杂,在大多数情况下(如果不是全部)与9x9数独网格紧密耦合。所以不容易推广到其他sudokus(例如4x4,16x16,6x6等)

  4. 人类技术的难度等级非常主观。例如,为什么 x-wing 隐藏单曲更难? (personaly已经解决了许多困难的已发布的数独游戏并且从未使用过这种技术)

  5. 使用了另一种方法,它具有以下好处:

    1. 概括为任意sudokus(9x9,4x4,6x6,16x16等..)
    2. 具有所需难度的数独配置会生成一次并即时生成
    3. 难度等级是客观的。
    4. 如何运作?

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

      但是,要解决的时间与线索(数量)和每个空单元的平均替代品密切相关。

      扩展我的previous answer,有人提到,对于任何数独谜题,最小数量的线索是谜题的客观属性(例如for 9x9 grids the minimum number of clues for having a valid sudoku is 17

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

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

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

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

      (已使用此在线sudoku solver(以及this one)来关联测试sudokus的难度率

      该代码免费提供on github sudoku.js (along with sample demo application),这是一个缩小版的CrossWord.js,是JavaScript中的专业填字游戏构建者,由同一作者提供

答案 1 :(得分:2)

数独难度与指定给定网格的唯一解决方案所需的(最小)信息量有趣地相关。

听起来像信息理论,是的,它也有应用程序。

Sudoku难题应该有一个独特的解决方案。此外,数独游戏具有一定的对称性,即按行,按列和按子方块。

这些对称性指定了所需的最小线索数(及其位置或多或少),以便解决方案是唯一的(即使用数独编译器或回溯搜索等算法)。

这将是最困难/最难的数独谜题级别(即最少需要的线索数量)。然后通过允许比所需的最小量更多的线索来生成所有其他难度级别的难度级别。

应该注意到数独难度级别不是标准,如上所述,可以根据需要具有尽可能多的难度级别。标准是最小数量(和位置)的线索(这是最难的水平,并且与数独对称相关),然后人们可以通过允许额外/冗余线索可以产生尽可能多的难度级别同样。

答案 2 :(得分:1)

嗯,在你知道如何解决它之前,你无法知道它有多复杂。并且Sudoku求解(因此也是难度等级)属于NP-C complexity class,这意味着它(很可能)在逻辑上不可能找到比渐进式猜测和检查更快(渐近)的算法。

但是,如果你能找到一个,你已经解决了P versus NP problem并且应该清除Fields Medal的橱柜......:)

答案 3 :(得分:0)

它并不像你要求的那样优雅,但你可以通过缓存来模拟这种行为:

  1. 决定谜题需要多少“桶”。例如,假设您选择20.因此,您的水桶将包含不同难度范围的谜题:0-.05,.05-.1,.1-.15,..,。9-.95,.95- 1
  2. 生成谜题
  3. 对拼图进行评分
  4. 将其放入适当的桶中(或在桶装满时扔掉)
  5. 重复直到你的水桶被“填满”。存储桶的大小及存储位置将根据您的应用需求而定。
  6. 然后,当用户请求某个难题时,从他们选择的桶中为他们提供缓存的难题。您可能还需要考虑交换数字和更改具有已知困难的谜题的方向,以生成具有相同难度级别的类似谜题。然后根据需要重复上面的内容,当你需要用新的谜题重新装满水桶时。