我必须制作一个数独模板,因此我需要将随机数放入矩阵中,但是不能在行或列中重复它们,但是我不能这样做。为此,我不能使用numpy。在这种情况下,我在下面的代码中进行了操作,但是它不起作用:
import random
matrix = []
for i in range(9):
line = []
for j in range(9):
number = random.randint(1, 9)
if number != i and number != j:
line.append(number)
matrix.append(line)
for i in range(9):
print(matrix[i])
答案 0 :(得分:1)
数独板具有随机数的有效机会很小。您将需要一种拓扑排序(动态编程)来满足行,列和块的约束。
例如:
known = [ [0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0]
]
import random
groups = [ p//27*3+p%9//3 for p in range(81) ]
colNums = [ set(range(1,10)) for _ in range(9) ]
rowNums = [ set(range(1,10)) for _ in range(9) ]
grpNums = [ set(range(1,10)) for _ in range(9) ]
sudoku = [ [0]*9 for _ in range(9) ]
for pos in range(81):
row,col,group = pos//9,pos%9,groups[pos]
fixed = known[row][col]
if fixed:
sudoku[row][col] = fixed
colNums[col].discard(fixed)
rowNums[row].discard(fixed)
grpNums[group].discard(fixed)
pos = 0
tried = [ set() for _ in range(81)]
while pos in range(81):
row,col,group = pos//9,pos%9,groups[pos]
number = sudoku[row][col]
fixed = known[row][col]
if number != 0 and not fixed:
sudoku[row][col] = 0
colNums[col].add(number)
rowNums[row].add(number)
grpNums[group].add(number)
available = {fixed} if fixed else colNums[col] & rowNums[row] & grpNums[group]
available -= tried[pos]
if available:
number = fixed or random.choice(list(available))
if not fixed:
sudoku[row][col] = number
colNums[col].discard(number)
rowNums[row].discard(number)
grpNums[group].discard(number)
tried[pos].add(number)
pos += 1
else:
tried[pos] = set()
pos -= 1
if pos < 81:
print("FAILED!")
else :
for r,line in enumerate(sudoku):
print(*[line[i:][:3] for i in range(0,9,3)],"\n"*(r%3==2))
此算法尝试使用尚未在同一行,列或组(块)上使用的剩余数字填充每个位置。 colNums
,rowNums
和grpNums
变量跟踪每个列,行和组中剩余的可用数字。当无法填补某个职位时,该算法将回溯到先前的职位,并尝试对该职位尚未尝试的另一个数字。
可以使用固定值初始化known
矩阵,该值将强制出现在数独数独矩阵中的相应位置。它可用于解决数独问题或验证问题是否可行。
答案 1 :(得分:0)
继续循环,知道在第= []行中找到9个不同的数字
import random
matrix = []
for i in range(9):
line = []
j = 1
while j <= 9:
number = random.randint(1, 9)
if number not in line:
line.append(number)
j += 1
matrix.append(line)
for i in range(9):
print(matrix[i])