数独检查器和生成器:检查但不会生成
Sudoku Checker & Generator: Checks But Won't Generate
我制作了一个程序:
- 生成(可能是错误的)数独解法。
- 检查解决方案是否正确
- 如果是,打印它。
- 如果不是,返回步骤 1。
它能正确检测有效和无效的解决方案。
我从不出错。
但是:
当告诉程序生成一个新的随机解决方案时,直到它找到一个有效的解决方案,它只是保持运行。
我生成尝试 'solutions' 的方法是制作一个包含 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
.
Posts I checked:
- Random sudoku generation (but it's C - not python).
- Recursive solution to Sudoku generator (Java - not python).
- Generating minimal/irreducible Sudokus (bumped into it, but not my question).
- Java sudoku generator not working correctly (Java. Also, it's a different problem).
- Generation of sudoku questions (different question).
- Sudoku generator loop (Java, different question).
- Sudoku generation speed (Java)
- Sudoku Generator (Different question).
请考虑投票。如果您认为这个问题可以改进,请提出改进方法。
备案,以及评论中的讨论:
您基本上是在生成随机 9x9 矩阵,直到其中一个是数独解法。
问题是您使用了非常弱的约束:从 1 到 9 的整数,并且每一行都是唯一的。
您实际生成有效解决方案的可能性非常低(计算它是一个很好的数学练习!)。因此,您的代码可能 运行 看似永远,即使它在逻辑上终止。
在这种情况下依赖随机性并不是正确的解决方案。
我使用 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())
我制作了一个程序:
- 生成(可能是错误的)数独解法。
- 检查解决方案是否正确
- 如果是,打印它。
- 如果不是,返回步骤 1。
它能正确检测有效和无效的解决方案。
我从不出错。
但是:
当告诉程序生成一个新的随机解决方案时,直到它找到一个有效的解决方案,它只是保持运行。
我生成尝试 'solutions' 的方法是制作一个包含 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
.
Posts I checked:
- Random sudoku generation (but it's C - not python).
- Recursive solution to Sudoku generator (Java - not python).
- Generating minimal/irreducible Sudokus (bumped into it, but not my question).
- Java sudoku generator not working correctly (Java. Also, it's a different problem).
- Generation of sudoku questions (different question).
- Sudoku generator loop (Java, different question).
- Sudoku generation speed (Java)
- Sudoku Generator (Different question).
请考虑投票。如果您认为这个问题可以改进,请提出改进方法。
备案,以及评论中的讨论:
您基本上是在生成随机 9x9 矩阵,直到其中一个是数独解法。 问题是您使用了非常弱的约束:从 1 到 9 的整数,并且每一行都是唯一的。
您实际生成有效解决方案的可能性非常低(计算它是一个很好的数学练习!)。因此,您的代码可能 运行 看似永远,即使它在逻辑上终止。
在这种情况下依赖随机性并不是正确的解决方案。
我使用 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())