数独生成器 - 索引矩阵,测试行/列中的重复值

时间:2018-04-27 08:33:36

标签: python python-2.7 numpy

我撒谎。它不是真正的数独生成器,但我试图随机生成一个5x5矩阵,有点像完整的数独网格,其中数字不会在每行或每列中重复。但是,我不需要检查一个数字是否在一个框内重复。

import numpy as np
from random import randint

def genRandomMatrix():
    matrix = np.zeros((5,5))

    for ix in range(5):
        for iy in range(5):
            u = randint(1,5)    # generate random int to test
            while True:
                if u in matrix[ix][:] or u in matrix[:][iy]:
                    # test if random int already in indexed row or indexed column

                    u = randint(1,5)
                    # if in row/column, try a new random int

                else:
                    matrix[ix][iy] = u
                    # safe to insert random int

                    break

            print matrix

genRandomMatrix()

输出只会在卡住之前创建一行:

[[3. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
[[3. 1. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
[[3. 1. 2. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
[[3. 1. 2. 4. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
[[3. 1. 2. 4. 5.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]

1 个答案:

答案 0 :(得分:0)

您在if u in matrix[ix, :] or u in matrix[:, iy]: 错误中使用行和列切片。

将您的if语句更改为:

import numpy as np
from random import randint

def genRandomMatrix():
    matrix = np.zeros((5,5))

    for ix in range(5):
        for iy in range(5):
            while True:
                # random int
                u = randint(1,5)

                # test if random int already in indexed row or indexed column
                if u in matrix[ix, :] or u in matrix[:, iy]:
                    continue
                else:
                    matrix[ix][iy] = u
                    break

            print matrix

genRandomMatrix()

顺便说一句,这似乎更加优雅,快速修复。

@WebMvcTest