首页 > 解决方案 > 数独生成器 - 索引矩阵,测试行/列中的重复值

问题描述

我说谎了。它不是真正的数独生成器,但我正在尝试随机生成一个 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.]]

标签: pythonpython-2.7numpy

解决方案


numpy.matrix错误地使用了行和列切片。

将您的 if 语句更改为:

if u in matrix[ix, :] or u in matrix[:, iy]:

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

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()

推荐阅读