如何生成数独谜题?


17

我正在尝试制作数独拼图生成器。这比我预期的要难得多,而且我投入的越多,就越难!

我当前的方法是将问题分为两个步骤:

  1. 生成完整(已解决)的数独难题。
  2. 删除数字直到可解决,并且只有一种解决方案。

在第1步中,由于我使用的是蛮力方法,因此我遇到了一些运行时问题。有没有填写完整数独难题的最佳方法?

在第2步中,应该使用哪种算法“解谜”数独?


这个问题有一些信息,您可以提取如何生成谜题
棘轮怪胎

3
这个问题也被问过困惑(和有没有更好的答案):puzzling.stackexchange.com/questions/142/...
congusbongus

Answers:


30

我在iOS应用商店上有一个最畅销的数独游戏。这是我产生难题的方式。

首先,我有一个拼图生成器应用程序。但这不是游戏代码的一部分。这是我用来制作拼图的独立应用程序。它经过了高度修改,因此我可以将其设置为创建不同的模式类型,难度等级,给定数量等。生成难题并获得一致的难度级别是很难做到的,而且比玩家希望等待的时间更长。因此,我生成了所谓的“种子拼图”,这就是游戏代码用来生成人们玩的拼图的东西。

我不在这里回答如何编码生成器。您可以在Google上在线查找大量的拼图生成器代码。从那里开始。但是要制作出出色的游戏,您需要制作出出色的游戏。我的游戏不会即时产生困惑。

我的谜题生成器应用程序的工作方式是每分钟生成数千个谜题,但是它们并不是都很好,并且它们都不都符合特定的难度等级。生成器创建一个难题,然后对其进行求解并找出难度等级,并根据解决难题所需的技术对难题进行评分,并确定是否需要猜测才能解决(通常很糟糕)。它会抛出任何不符合标准的难题。对于较难但并非不可能的难题,在快速的机器上,可能需要一个小时才能生成100个符合我的确切要求的难题。这就是为什么我不在应用程序中执行此操作的原因。在那些苛刻的规格下实时生成拼图对于我在应用程序中拥有的拼图质量不起作用。

拼图是字符串,长162个字符,带空格的81个字符,带数字和破折号或点,然后是带有解的另外81个字符。然后是每个统计信息的列,例如单打,双打等的数量。

我在所有生成会话中的输出都是以逗号分隔的行,并且统计信息作为列。我可能会拿出10,000个拼图,将它们带入卓越领域,并按难度对它们进行排序。然后将它们带入应用程序以在游戏板上查看它们。我还看它们的视觉吸引力和拼图的可见图案。然后,我从中挑选。

我称它们为种子拼图,这就是我的意思。数独游戏中的数字实际上只是令牌。它们不是颜色1-9,而是颜色,符号或字母。所以我的种子难题不是数字,而是字母ai。每个种子拼图都会即时更改以制作一个可玩的拼图:

  1. 随机化数字/令牌。当我将字母ai转换回数字1-9时,查找表将被随机化。这意味着a并不总是1。仅此一个就为每个难题创造了约300,000个变体。
  2. 将拼图旋转90、180或270度。这增加了4种变化。
  3. 水平,垂直或同时翻转拼图。这增加了4种变化。

因此,每个种子难题都可以创造5,806,080个变化。我已经在实际玩家中对此进行了测试。人们不知道他们实际上在玩同样的难题。实际上这是不可能的。只有当他们每次都注意到给定的模式相同时。但是,即使有100种不同的种子,也没人会注意到。我的游戏没有一百万用户。我还使用求解器应用程序对其进行了测试。旋转或翻转时,求解器应用程序无法以相同的方式解决难题。即使在技术上是相同的难题,有时它甚至会将其分析为不同的难度等级。

但是,Big Bad Sudoku Book在5个难度级别中具有1000个种子拼图中的10个,并且有多种拼图模式类型。这意味着我的游戏中有数十亿个难题。每10,000个种子拼图,有58,060,800,000个不同的拼图。

在Sudoku Book版本4(将于2016年到期)中,我想出了一种方法,可以从这580亿中指定一个确切的谜题,并在每个玩家的设备上获得相同的谜题。


非常有用的帖子。您是否以任何方式检查生成的种子是否可以由其他种子创建,这意味着您拥有相同的种子?
VLAS

是。我将它们全部放在textmate中并进行排序。然后删除重复项。我认为它从未删除过。种子绝对是独一无二的。用两个不同的种子来制作相同的拼图是不可能的。有一天,我将显示确切的过程,但是现在当我仍然从我的方法中受益时,不再显示。:)
badweasel

实际上,我的整个过程几乎都在这里。
badweasel

2
+1表示数字只是令牌,您可以进行更改的方法就是更改分配给字母的数字。
S. Mitchell

确实有用的答案!由于您有3列和3行,因此您应该能够将中间的列向左或向右移动,并将中间的行向顶部或底部移动,以生成4个以上的变体。而不是垂直翻转拼图或水平翻转拼图,您只需将左右两列(以及上排和下排)换成另外4个变体即可。因此,我认为您必须从一粒种子获得4300万种变异。
Roger_S 2016年

4

在步骤(1)中,生成一个完整的(已解决的)数独难题,因为我使用的是蛮力方法,所以我遇到了一些运行时问题。有没有填写完整数独难题的最佳方法?

填写完整的Sudoku拼图有一种简单的方法-分组填充和循环移位。

  1. 用九个不同的数字填充第一行。
  2. 填充第二行,这是第一行的三个插槽的移位。
  3. 填充第三行,这是第二行的三个插槽的移位。
  4. 填充第四行,这是第三行移位一个插槽。


line 1: 8 9 3  2 7 6  4 5 1
line 2: 2 7 6  4 5 1  8 9 3 (shift 3)
line 3: 4 5 1  8 9 3  2 7 6 (shift 3)

line 4: 5 1 8  9 3 2  7 6 4 (shift 1)
line 5: 9 3 2  7 6 4  5 1 8 (shift 3)
line 6: 7 6 4  5 1 8  9 3 2 (shift 3)

line 7: 6 4 5  1 8 9  3 2 7 (shift 1)
line 8: 1 8 9  3 2 7  6 4 5 (shift 3)
line 9: 3 2 7  6 4 5  1 8 9 (shift 3)

为了防止用户注意到明显的模式,最好随机化行和列的顺序,以便不再有任何模式。只要每行/列中的所有9个数字作为一个原子单位一起移动,Sudoku板将始终保持有效。

您将获得一个完整的数独难题。有关更多详细信息,您可以搜索“ make Sudoku”。


3

只要您有数独求解器,就不太困难了。

制作数独求解器是一个困难/有趣的问题,因此最好将其保存为其他问题。或者,您也可以阅读此书,然后看看自己的情况。

  1. 要生成已解决的难题,只需在空板上运行解算器即可。唯一需要注意的是,您应该将求解器使用的“猜测”随机化,否则每次都可能会遇到相同的难题。也就是说,求解器会在某个时候尝试为单元格编号;它可能会按此顺序尝试:1, 2, 3, 4, ...然后选择第一个可行的方法。您需要重新整理该顺序,以便尝试执行4, 7, 2, 9, ...。此过程应与您的求解器一样快。
  2. 要删除数字,请使用以下算法:
    • 选择一个您从未尝试删除的随机数
    • 删除数字,在没有使用删除数字的条件下运行求解器
    • 如果求解器找到了解决方案,则无法删除该数字
    • 重复,直到您删除了足够的数字(或者您再也无法删除)

这是一种非常简单(而且很幼稚)的方法,因此无法保证您会遇到某种困难的难题-除了遗漏的数字数量之外,甚至无法删除所需数量的数字。希望这对您有所帮助。


确保求解器无法从同一状态找到多个解决方案。通常,只有一种解决方案。另外,您可以检查求解器需要采取哪些逻辑步骤来找到解决方案以确定难度,例如,是否需要使用X-wing策略或...?
OriginalDaemon

1
@OriginalDaemon关于您的第一点,在第三个点中涉及:如果删除该数字导致第二个解决方案,请返回。
congusbongus 2014年

0

我只是觉得指出此网页很有趣,因为它对我的proyect开发有很大帮助。用独特的解决方案制作数独并非一件简单的事情。在链接中,您可以找到作者(他确实做得很好,没错!)如何找到几种不同的策略。您可能有一个想法可以生成自己的Sudoku求解器。

现在,围绕该主题,还有一种方法可以生成类似的数独,

  1. 行的排列。
  2. 另一种简单的解决方案是,首先填写最小数位的数独(17位数)(其经过验证的最小数,以找到唯一的解决方案),然后填写以下不同的策略(例如,在上一链接中,策略是根据困难划分的,可以做类似的事情),直到找到独特的解决方案为止。
  3. 有一个数学家试图找到一个16位起始数独数独的数独列表,还有一个HUGEEEEEE列表中的17位数独独一的数独。我不记得他有没有写过任何副本,但是我很确定,如果您可以向他提供其他17种独特的解决方案,数独将非常高兴让您使用他的数据。

用算法加油打气:D


嗯,该链接用于数独求解器,而不是生成器。
greenoldman

@greenoldman是的,它是一个解决方案。我认为这对用户来说很有趣,因为他当前的方法是删除数字并求解。链接给出的策略更快地解决他的谐音数独的
戴维·桑切斯

0

我的求解器正在使用蛮力,并且可以在20毫秒内找到解决方案。通过使用上述删除方法,我的生成器在200毫秒内产生了一个难题。

它通常会产生大约剩余24-34位数字的谜题,但我仍然不知道他们在世界上如何设法产生17位数字的谜题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.