Генератор судоку - индексная матрица, проверка на повторное значение в строке / столбце - PullRequest
0 голосов
/ 27 апреля 2018

Я лгу. Это на самом деле не генератор Судоку, но я пытаюсь случайным образом сгенерировать матрицу 5х5, что-то вроде заполненной сетки Судоку, где числа не повторяются в каждой строке или столбце. Однако мне не нужно проверять, повторяется ли число в рамке.

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 голосов
/ 27 апреля 2018

Вы используете разделение строк и столбцов в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...