Мы должны проверить, действительна ли данная доска судоку.
Каковы правила заполнения доски судоку?
- Каждая строка должна содержать цифры 1–9 без повторения.
- Каждый столбец должен содержать цифры 1–9 без повторения.
- Каждый из девяти подблоков сетки 3x3 должен содержать цифры 1–9 без повторения (для справки посмотрите на изображение выше, которое будет иметь темное деление)
Решение
Входные данные:2D-массив/список чисел, если у конкретной позиции нет значений, тогда она будет иметь «.» .
Вывод: логическое значение (True/False).
Идея:
Мы собираемся перебрать заданный ввод, если текущее значение не возникло ранее на основе трех вышеуказанных условий, затем мы можем продолжить цикл, если оно уже произошло, затем, наконец, вернуть False, если мы достигли конца массива, а затем вернуть True.
Решение Python:
class Solution: def isValidSudoku(self, board: List[List[str]]) -> bool: rows = collections.defaultdict(set) cols = collections.defaultdict(set) square = collections.defaultdict(set) for i in range(9): for j in range(9): if board[i][j]=='.': continue if(board[i][j] in rows[i] or board[i][j] in cols[j] or board[i][j] in square[(i//3,j//3)]): return False rows[i].add(board[i][j]) cols[j].add(board[i][j]) square[(i//3,j//3)].add(board[i][j]) return True
объяснение кода:
У нас будут отдельные словари для хранения ранее произошедших значений на основе трех условий, и мы будем просто зацикливать ввод.
Если это уже произошло ранее, просто верните False, иначе просто добавьте текущее значение в три словаря с их конкретным ключом, чтобы в будущем мы могли проверить, есть ли текущее значение или нет.
пожалуйста, прокомментируйте ниже, если у вас есть какие-либо решения или вопросы.
Спасибо….