Truble在python中为数独创建矩阵

时间:2019-06-03 02:14:11

标签: python

我必须制作一个数独模板,因此我需要将随机数放入矩阵中,但是不能在行或列中重复它们,但是我不能这样做。为此,我不能使用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])

2 个答案:

答案 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))

此算法尝试使用尚未在同一行,列或组(块)上使用的剩余数字填充每个位置。 colNumsrowNumsgrpNums变量跟踪每个列,行和组中剩余的可用数字。当无法填补某个职位时,该算法将回溯到先前的职位,并尝试对该职位尚未尝试的另一个数字。

可以使用固定值初始化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])