В чем проблема с моим искателем судоку? - PullRequest
0 голосов
/ 01 октября 2019

Для кодового сигнала я представил решение проблемы sudoku2. Однако это работает для всех тестовых случаев, кроме одного, где число повторяется в блоке 3 на 3 в середине головоломки, и функция возвращает значение true вместо false.

Программа должна сначала проверить, все ли строки и столбцы имеют разные номера, используя checkRows и checkColumns. Затем он повторяет check3by3 для каждого блока чисел 3 на 3. Он повторяет каждый столбец на 3 каждый раз, когда проверяется блок, а затем повторяет на 3 для строк, когда столбец достигает своего предела. Функция check3by3 создает набор для чисел, уже находящихся в блоке, и добавляет номера в набор, если он не повторяется. Если число повторяется, оно будет в наборе, и функция вернет false.

def sudoku2(grid):
    if checkRows(grid) and checkColumns(grid):
        for i in range(0,len(grid),3):
            for j in range(0,len(grid),3):
                if check3by3(grid , i + 3, j + 3):
                    return True

    return False

def checkRows(puzzle):
    for list in puzzle:
        s = set()
        for item in list:

            if item in s:
                return False

            elif item == '.':
                pass

            else:
                s.add(item)

    return True


def checkColumns(puzzle):
    for i in range(len(puzzle)):
        s2 = set()
        for j in range(len(puzzle)):
            if puzzle[j][i] in s2:
                return False
            elif puzzle[j][i]  == '.':
                pass
            else:
                s2.add(puzzle[j][i])

    return True

def check3by3(puzzle , row , column):
    set3 = set()
    for i in range(row):
        for j in range(column):
            if puzzle[i][j] in set3:
                return False
            elif puzzle[i][j] == '.':
                pass
            else:
                set3.add(puzzle[i][j])

    return True

Что я могу сделать с моей программой, чтобы решить эту проблему?

1 Ответ

0 голосов
/ 01 октября 2019

Ваша основная проблема в том, что вы пытаетесь запустить функцию check3by3() 3 раза внутри цикла for, но вы возвращаетесь из функции sudoku2() после того, как первый вызов вернет True. Вы даже не попадаете во второй или третий ряд сетки 3х3. Я бы порекомендовал проверить False возвращаемое значение из check3by3 и иметь sudoku2() return True только в том случае, если он действительно проходит весь цикл.

Как только вы это решили,следующая проблема, с которой вы столкнетесь, - это проблема с range() в вашей функции check3by3(). Если вы предоставите только один аргумент range(), он проверит каждое значение от 0 до значения, которое вы ему передали. Итак, в первом цикле вы передаете его range(3), который будет работать нормально, так как вы хотите проверить строки 0, 1 и 2. Но как только вы доберетесь до следующего ряда сеток, вы будете вызывать range(6),где вы будете проверять все строки от 0-5.

Здесь нужно вместо добавления 3 к вызову check3by3 просто передать неизмененный номер строки и столбца, а затем вместо вызова range(row) и range(column), вы хотите позвонить. range(row, row+3) и range(column, column+3). Таким образом, когда вы проверяете вторую строку блоков 3х3, вы будете выполнять итерацию по range(3, 6) (3, 4, 5) вместо range(6) (0, 1, 2, ... 5)

Я не могу гарантировать, что после этого у вас не возникнет больше проблем;Я не выглядел очень тщательно на всю программу, но это должно привести вас на правильный путь к решению вашего непосредственного вопроса.

...