【问题标题】:Sudoku Checker & Generator: Checks But Won't Generate数独检查器和生成器:检查但不会生成
【发布时间】:2016-12-02 00:49:42
【问题描述】:

我做了一个程序:

  1. 生成(可能是错误的)数独解决方案。
  2. 检查解决方案是否正确
  3. 如果是,打印它。
  4. 如果没有,请返回步骤 1。

它可以正确检测有效和无效的解决方案。
我永远不会出错。

但是:

当告诉程序生成一个新的随机解决方案时,直到它找到一个有效的解决方案,它只是继续运行

我生成尝试的“解决方案”的方式是列出 9 个列表,每个列表包含 9 个数字,每个列表都是数字 1-9 混合在一起,如下所示:

   SUDOKU_ATTEMPT = [[8, 9, 6, 3, 7, 4, 2, 5, 1],
                     [6, 3, 4, 8, 1, 9, 7, 2, 5],
                     [1, 2, 5, 6, 8, 4, 7, 3, 9],
                     [1, 2, 9, 4, 3, 7, 8, 5, 6],
                     [6, 4, 9, 2, 3, 1, 7, 8, 5],
                     [3, 1, 8, 2, 7, 4, 9, 5, 6],
                     [3, 7, 2, 8, 4, 9, 5, 6, 1],
                     [7, 2, 1, 6, 4, 5, 3, 8, 9],
                     [2, 7, 8, 9, 4, 5, 1, 3, 6]]

如您所见,rows 是正确的。
但不是(必然)columns,也不是3 x 3 boxes

我查看的帖子:

请考虑投票。如果您认为这个问题可以改进,请提出如何改进。

【问题讨论】:

  • 您是否正在生成随机的 9x9 矩阵,其每一行的整数从 1 到 9,直到其中一个是有效的数独解决方案?
  • 我不确定什么是矩阵,但我认为答案是肯定的。
  • 取决于您的代码,这可能没有优化(这里没有批评者)以及 9x9 矩阵是有效数独解决方案的概率(我在三年前计算并忘记了但相信我它很低),可能需要一小时或数年。特别是如果您不记录先前生成的矩阵(您不能这样做,因为您会造成内存溢出)。无论如何,这里只依赖随机并不是好的解决方案。
  • 看看stackoverflow.com/questions/6924216/…,它为您提供了许多尝试的选择。
  • 生成有效数独的一种简单而快速的方法是从一个有效的解决方案开始,然后按照here 的描述对其进行一些随机排列。

标签: python python-2.7 random sudoku


【解决方案1】:

记录在案,并来自 cmets 中的讨论:

您基本上是在生成随机 9x9 矩阵,直到其中一个是数独解决方案。 问题是您使用了非常弱的约束:从 1 到 9 的整数,并且每一行都是唯一的。

您实际生成有效解决方案的概率非常低(计算它是一个很好的数学练习!)。因此,您的代码很可能看似永远运行,即使它在逻辑上终止。

在这种情况下,依赖随机性到这种程度并不是正确的解决方案。

【讨论】:

  • 你可以在我的 GitHub 上看到我的解决方案!感谢您的帮助 - 请考虑投票。
【解决方案2】:

我用python3做了一个数独生成器。下面是代码以及一些规则,以便于理解:

import numpy as np
import random

sudo_list = np.array(\
[[1, 2, 3, 4, 5, 6, 7, 8, 9],
 [4, 5, 6, 7, 8, 9, 1, 2, 3],
 [7, 8, 9, 1, 2, 3, 4, 5, 6],
 [2, 3, 1, 5, 6, 4, 8, 9, 7],
 [5, 6, 4, 8, 9, 7, 2, 3, 1],
 [8, 9, 7, 2, 3, 1, 5, 6, 4],
 [3, 1, 2, 6, 4, 5, 9, 7, 8],
 [6, 4, 5, 9, 7, 8, 3, 1, 2],
 [9, 7, 8, 3, 1, 2, 6, 4, 5], ])


def shuffle(m, n, t=False):
    global sudo_list
    if t:
        np.random.shuffle(np.transpose(sudo_list[:, m:n]))
    else:
        np.random.shuffle(sudo_list[m:n, :])


def sudokuGenerator():
    global sudo_list
    # Step 3: Shuffling Col 1-3
    for i in range(random.randint(5, 10)):
        shuffle(0, 3, True)
    # Step 4: Shuffling Col 4-6
    for i in range(random.randint(5, 10)):
        shuffle(3, 6, True)
    # Step 5: Shuffling Col 7-9
    for i in range(random.randint(5, 10)):
        shuffle(6, 9, True)
    # Step 6: Shuffling Row 1-3
    for i in range(random.randint(5, 10)):
        shuffle(0, 3)
    # Step 7: Shuffling Row 4-6
    for i in range(random.randint(5, 10)):
        shuffle(3, 6)
    # Step 8: Shuffling Row 7-9
    for i in range(random.randint(5, 10)):
        shuffle(6, 9)
    # Step 9: Shuffling rows in sets of 3
    rows = np.array_split(sudo_list, 3)
    for i in range(random.randint(5, 10)):
        random.shuffle(rows)
    sudo_list = np.vstack(rows)
    # Step 10: Shuffling columns in sets of 3
    col = np.array_split(sudo_list.T, 3)
    for i in range(random.randint(5, 10)):
        random.shuffle(col)
    sudo_list = np.vstack(col)

    return sudo_list

print(sudokuGenerator())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2014-08-23
    • 2023-03-04
    • 1970-01-01
    • 2017-11-18
    • 2019-05-04
    • 2021-01-30
    相关资源
    最近更新 更多