根据解决方案制定数独谜题

Formulate sudoku puzzle given the solutions

我最近刚刚在 java 中使用回溯法做了一个数独求解器。

是否有可能根据解决方案提出问题或难题?

编辑

制定原始拼图,有什么方法可以实现吗?

还有一个问题,

给出谜题和答案。

如果我能够使用解决方案解决难题(结果是难题)

同时能够使用拼图解出答案(结果为答案)

哪个数字大?

谜题?或解决方案?

可以制定多个可能原始状态之一。

  1. 从最终解决方案开始(所有数字都存在)
  2. 删除一个号码(随机选择或不选择)
  3. 根据棋盘的当前状态检查是否可以找回这个数字(你已经有了求解器,应该很容易)
  4. 如果能计算出这个数字,就万事大吉了。回到2.
  5. 如果这个号码找不到了,就把它放回原来的地方。回到2.

如果没有更多的数字可以删除,你就达到了拼图的原始状态之一。

如果您选择了随机删除的数字(第 2 步),您可以多次执行此操作,并获得导致相同最终拼图的不同起点。

If I am able to solve the puzzle using the solutions (result is puzzles) and at the same time able to solve the solutions using the puzzle (result is solutions)

Which has the greater number?

the puzzles? or the solutions?

没有明确的答案。

每个解决方案恰好有 281 个对应的谜题,包括琐碎的谜题。并非所有这些都有独特的解决方案,但很多都有。因此,如果选择的解集只包含一个元素,那么共同对应解集的最大谜题集就大得多。

另一方面,the completely blank puzzle affords 6670903752021072936960 solutions。有很多对那些只共享空白网格作为一个共同的谜题。因此,如果选择的谜题集只包含空白网格,那么对应的解集就会大得多。

根据解决方案创建谜题非常简单。您只需向后应用求解步骤。

比如一行有8个数字,你可以填第9个。如果你向后做,如果一行包含 9 个数字,你可以删除一个。这将产生一个非常无聊的谜题,但仍然是一个有效的谜题(一个有效的谜题是只有一个解决方案的谜题)。

你做的步骤越复杂,拼图就越难。事实上,暴力破解是最困难的策略,向后执行它可能归结为随机删除一个数字,然后暴力检查是否仍然只有一个唯一的解决方案。请注意,您不必解决整个谜题:这足以证明只有一种方法可以将删除的数字重新添加到谜题中。

关于你问题的后半部分:感觉有点像数学题,我来回答一下:

一个好的拼图只有一种解法。由于有多个谜题产生相同的解决方案(例如,有 81 种方法可以填充 81 个方块中的 80 个,所有这些都从不同的谜题中产生相同的解决方案),你可以说谜题比解决方案多得多。

如果您还允许有多个解决方案的谜题,它就会改变。对于每一个谜题,必定有一个或多个解法,但所有这些解法也都属于那个谜题,所以解谜题的解数等于解谜题的解数。无效的谜题不会改变这一点:因为它们属于 0 个解决方案,所以您不需要属于这些解决方案的额外谜题。

Ps。如果不需要唯一可解,创建谜题也很简单:只需随机删除一些数字即可。