
Python. Валидность поля SUDOKU Все знают SUDOKU.На входе дают 9 строк.
Например195743862431865927876192543387459216612387495549216738763524189928671354254938671Это построчные наборы цифр.Необходимо проверить чтобы каждая строка содержала от 1 до 9Каждый столбец содержал от 1 до 9И каждый маленький квадратик 3*3 (9 шт) содержал от 1 до 9Чтобы было все и не повторялось.Считать циферки можно так:A=[list(input()) for i in range(9)]И это уже даже будет списком двухмерным.Затем можно проверить строки быстроfor i in range(9): if len(set(A[i]))!=9: print('все плохо :)') #здесь проверка когда еще был одномерный список, но идея должна быть понятна.но надо еще столбцы проверить, что в принципе легко и самое интересное квадратики. Кто подскажет нерутинные интересные решения?Еще для теста295743861431865927876192543387459216612387495549216738763524189928671354154938672На выходе Yes/No (валидное игровое поле или где-то накосячено).Можно и рутинные, но чтоб не очень сильно :). Предлагайте.Не знающим - проходите мимо.

Ответы на вопрос

Для проверки столбцов вы можете использовать простой цикл с вложенным циклом. Внешний цикл будет проходить по всем столбцам, а внутренний цикл будет проходить по всем строкам, и проверять каждый элемент столбца с помощью set.
for j in range(9):
column = [A[i][j] for i in range(9)]
if len(set(column)) != 9:
print("Invalid column")
Для проверки квадратов 3x3 вы можете использовать три цикла, один для каждой строки квадрата, один для каждого столбца квадрата, и один для каждого квадрата.
for i in range(0, 9, 3):
for j in range(0, 9, 3):
square = [A[x][y] for x in range(i, i+3) for y in range(j, j+3)]
if len(set(square)) != 9:
print("Invalid square")
И если в ходе этих операций не было выведено Invalid column и Invalid square то это валидное поле.



import random
def print_sudoku(sudoku): # вывод судоку на экран
for i in range(9): # 9 строк судоку
for j in range(9): # 9 столбцов судоку
print(sudoku[i][j], end=' ') # вывод значения судоку
print() # переход на новую строку
def check_sudoku(sudoku, row, col, num): # проверка судоку на правильность
for i in range(9): # 9 строк судоку
if sudoku[i][col] == num: # проверка строки
return False
for j in range(9): # 9 столбцов судоку
if sudoku[row][j] == num: # проверка столбца
return False
for i in range(3): # 3 строки в квадрате 3x3
for j in range(3): # 3 столбца в квадрате 3x3
if sudoku[(row // 3) * 3 + i][(col // 3) * 3 + j] == num: # проверка квадрата 3x3
return False
return True
def generate_sudoku(sudoku, row, col): # генерация судоку
if row == 9: # если все строки судоку заполнены
return True
if col == 9: # если все столбцы судоку заполнены
return generate_sudoku(sudoku, row + 1, 0)
if sudoku[row][col] != 0: # если ячейка судоку не пустая
return generate_sudoku(sudoku, row, col + 1)
for num in range(1, 10): # перебор чисел от 1 до 9
if check_sudoku(sudoku, row, col, num): # проверка судоку на правильность
sudoku[row][col] = num # заполнение ячейки судоку
if generate_sudoku(sudoku, row, col + 1): # генерация судоку
return True
sudoku[row][col] = 0 # очистка ячейки судоку
return False
def main(): # главная функция программы
sudoku = [[0 for j in range(9)] for i in range(9)] # создание судоку
generate_sudoku(sudoku, 0, 0) # генерация судоку
print_sudoku(sudoku) # вывод судоку на экран
if __name__ == '__main__': # проверка на запуск файла
main() # запуск главной функции программы




Вот пример более компактного и эффективного решения для проверки валидности поля Sudoku:
pythondef validate_sudoku(board):
# Проверка строк и столбцов
for i in range(9):
if len(set(board[i])) != 9 or len(set(row[i] for row in board)) != 9:
return False
# Проверка квадратов 3x3
for i in range(0, 9, 3):
for j in range(0, 9, 3):
square = [board[x][y] for x in range(i, i+3) for y in range(j, j+3)]
if len(set(square)) != 9:
return False
return True
# Считываем цифры
board = [list(input()) for _ in range(9)]
# Проверяем валидность поля Sudoku
if validate_sudoku(board):
print("Yes")
else:
print("No")
В этом решении мы используем двойные циклы для проверки строк, столбцов и квадратов 3x3. Мы используем множества (set) для проверки уникальности чисел в каждой строке, столбце и квадрате. Если встречается дубликат, то возвращаем False
, иначе возвращаем True
.


Топ вопросов за вчера в категории Информатика







Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili