Как проверить после каждой записи в судоку, что она действительна или нет

Я искал приложение Судоку в магазине Google Play и нашел это приложение очень интересным. У них разные уровни сложности. Что я нахожу в этом приложении, так это то, что у них есть кнопка подсказки и автоматическая проверка ошибок, которая автоматически отсоединяет введенный вами номер или нет. Теперь я хочу знать, как я могу создать алгоритм, который будет выполнять ту же работу с введенным номером, правильно или нет. И как там работает кнопка подсказки?

Редактировать после комментария Павла: Теперь я знаю, как проверить, правильно ли введено значение. Теперь остается вопрос, как предоставить подсказку, аналогичную подсказке, предоставленной вышеупомянутым приложением. Когда я вкладываю подсказку Когда я нажимаю следующий

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

1 ответ

Ваш вопрос звучит запутанно. С одной стороны, вы спрашиваете, как проверить, является ли позиция судоку действительной или нет, но в примере вы показываете, как программа помогает найти позицию, в которой нужно поставить число (не проверяя свою судоку, но делая ход, чтобы решить ее),

Чтобы проверить судоку, вам нужно только убедиться, что числа в каждой строке / столбце / квадрате действительны. Это легко достигается с помощью заданной структуры данных. Я не знаю android и не успеваю посмотреть, поэтому вот простой код на python, который принимает массив строк и сообщает, действительна ли судоку:

from collections import Counter

def isValidCounter(cnt):
    del cnt[0]
    for i in cnt:
        if cnt[i] > 1:
            return False
    return True

def isValid(arr):
    M = [[int(i) if i != '.' else 0 for i in line] for line in arr]

    # rows
    for i in M:
        if not isValidCounter(Counter(i)):
            return False

    # columns
    for i in xrange(9):
        if not isValidCounter(Counter(M[j][i] for j in xrange(9))):
            return False

    # squares
    squares = [
        [M[0][i] for i in xrange(0, 3)] + [M[1][i] for i in xrange(0, 3)] + [M[2][i] for i in xrange(0, 3)],
        [M[0][i] for i in xrange(3, 6)] + [M[1][i] for i in xrange(3, 6)] + [M[2][i] for i in xrange(3, 6)],
        [M[0][i] for i in xrange(6, 9)] + [M[1][i] for i in xrange(6, 9)] + [M[2][i] for i in xrange(6, 9)],

        [M[3][i] for i in xrange(0, 3)] + [M[4][i] for i in xrange(0, 3)] + [M[5][i] for i in xrange(0, 3)],
        [M[3][i] for i in xrange(3, 6)] + [M[4][i] for i in xrange(3, 6)] + [M[5][i] for i in xrange(3, 6)],
        [M[3][i] for i in xrange(6, 9)] + [M[4][i] for i in xrange(6, 9)] + [M[5][i] for i in xrange(6, 9)],

        [M[6][i] for i in xrange(0, 3)] + [M[7][i] for i in xrange(0, 3)] + [M[8][i] for i in xrange(0, 3)],
        [M[6][i] for i in xrange(3, 6)] + [M[7][i] for i in xrange(3, 6)] + [M[8][i] for i in xrange(3, 6)],
        [M[6][i] for i in xrange(6, 9)] + [M[7][i] for i in xrange(6, 9)] + [M[8][i] for i in xrange(6, 9)]
    ]
    for square in squares:
        if not isValidCounter(Counter(square)):
            return False

    return True

А вот как выглядит этот массив:

[
  "53..7....",
  "6..195...",
  ".98....6.",
  "8...6...3",
  "4..8.3..1",
  "7...2...6",
  ".6....28.", 
  "...419..5",
  "....8..79"
]
Другие вопросы по тегам