BULATIKSPB
02.10.2022 04:26

решить данную сложную задачу. Сам не справляюсь. идея следующая: должны быть функции для проверки заполнение таблицы судоку. нужна функция, которая для каждой ещё не заполненные ячейки проверяет. Какие значения туда можно подставить также нужно. Дописать функции менеджера, которая проверяет корректность заполнения судоку.
Следующее сначала функция проходи, по всем клеткам судоку не заполненным и в какую-нибудь из клеток, в которой наименьшее количество вариантов можно подставить запускает саму себя же, по-моему со всеми вариантами, А дальше идёт по рекурсии, соответственно, все варианты, которые не подходят, они отсекаются функции, ничего не вызывают. все варианты, которые подходят они запускают в следующую итерацию новые функции, которые уже пытается подставлять в другие ячейки
Желательно не переименовывать данные. Если есть какие-то вопросы задавайте.
def print_sudoku(sudoku_data):
print(' ')
print(f'| {sudoku_data[0][0]} {sudoku_data[0][1]} | {sudoku_data[0][2]} {sudoku_data[0][3]} |')
print(f'| {sudoku_data[1][0]} {sudoku_data[1][1]} | {sudoku_data[1][2]} {sudoku_data[1][3]} |')
print(' ')
print(f'| {sudoku_data[2][0]} {sudoku_data[2][1]} | {sudoku_data[2][2]} {sudoku_data[2][3]} |')
print(f'| {sudoku_data[3][0]} {sudoku_data[3][1]} | {sudoku_data[3][2]} {sudoku_data[3][3]} |')
print(' ')

def check_unique_cells(cells_filled, cells):
is_not_filled = True
if cells_filled == 4:
is_not_filled = False
if cells_filled == len(set(cells)) - 1 * is_not_filled:
return True
return False

def check_rows(sudoku_data):
for row in sudoku_data:
cells_filled = 0
for cell in row:
if cell != 'X':
cells_filled += 1
if not check_unique_cells(cells_filled, row):
return False
return True

def check_columns(sudoku_data):
for i in range(len(sudoku_data)):
cells_filled = 0
column = []
for j in range(len(sudoku_data)):
if sudoku_data[j][i] != 'X':
cells_filled += 1
column.append(sudoku_data[j][i])
if not check_unique_cells(cells_filled, column):
return False
return True

def check_squares(sudoku_data):
indexes = [[0, 0], [2, 0], [0, 2], [2, 2]]
deltas = [[0, 0], [1, 0], [0, 1], [1, 1]]
for index in indexes:
cells_filled = 0
square = []
for delta in deltas:
if sudoku_data[index[0] + delta[0]][index[1] + delta[1]] != 'X':
cells_filled += 1
square.append(sudoku_data[index[0] + delta[0]][index[1] + delta[1]])
if not check_unique_cells(cells_filled, square):
return False
return True

def check_sudoku(sudoku_data):
if check_rows(sudoku_data) and check_columns(sudoku_data) and check_squares(sudoku_data):
return True
return False

if __name__ == '__main__':
sudoku_data = [['2', '3', '4', 'X'], ['X', 'X', 'X', '1'], ['X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X']]
print_sudoku(sudoku_data)
print(check_sudoku(sudoku_data))

Нажмите на рекламу ниже и сразу увидите ответ
Популярные вопросы:
Ответ:
sawbee
26.06.2020 20:38


1                                   ЧАСТИ РЕЧИ

Существительные -                                       Глаголы -

письмо                                                            съел

мальчик                                                           вьет

семья

тетрадь

подъем

2                                           РАЗДЕЛИТЕЛЬНЫЙ Ъ И Ь ЗНАКИ

ь                                                             ъ

Письмо                                                   Съел

Мальчик                                                  Подъем

Вьет

Семья

Тетрадь


0,0(0 оценок)
Ответ:
superminikotik
26.11.2022 00:13
Известно уравнение прямой, проходящей через две точки A(x₁,y₁) и B(x₂,y₂). Если третья точка C(x₃,y₃) лежит на этой же прямой, то после подстановки её координат уравнение обращается в тождество
\displaystyle \frac{x-x_1}{x_2-x_1}= \frac{y-y_1}{y_2-y_1} \to \frac{x_3-x_1}{x_2-x_1} \equiv \frac{y_3-y_1}{y_2-y_1}
Следовательно, нужно проверить, выполняется ли это тождество для заданных координат.
В этом тождестве есть одна неприятная вещь: если y₂=y₁ и/или x₂=x₁, то в знаменателе получается ноль, чему компьютер уж точно не обрадуется. Поэтому такой случай надо рассмотреть отдельно, исходя из геометрического смысла.
Если же y₂≠y₁ и x₂≠x₁, можно привести тождество к более удобному виду:
\displaystyle \frac{x_3-x_1}{x_2-x_1} \equiv \frac{y_3-y_1}{y_2-y_1} \to (x_3-x_1)(y_2-y_1)\equiv (y_3-y_1)(x_2-x_1); \\ p_1=(x_3-x_1)(y_2-y_1), \ p_2=(y_3-y_1)(x_2-x_1), \ p_1\equiv p_2
Поскольку координаты могут быть и не целыми, а такие нецелые ("вещественные") числа представляются в компьютере с ограниченной точностью, тождество может оказаться ложным по причине такой неточности. Для обхода такого случая будем полагать, что два значения равны друг-другу, если их разность по модулю не превышает некоторой малой величины, т.е.:
|p_1-p_2|\leq \epsilon, \ \epsilon=10^{-8}

Вернемся к случаю y₂=y₁. В этом случае прямая параллельна оси Х, т.е. тогда условием принадлежности третьей точки данной прямой будет y₃=y₁ при любом х. То же можно сказать и про случай х₂=х₁, когда следует проверить, что х₃=х₁.

Если все три точки лежат на одной прямой, то у средней из них значение любой из координат должно находиться между значениями двух одноименных координат крайних точек.

// PascalABC.NET 3.0, сборка 1160 от 05.02.2016
var
  x1,y1,x2,y2,x3,y3,p1,p2:real;
  on_line:boolean;
begin
  // Без проверки считаем, что у двух любых точек
  // не может быть одинаковых координат
  Write('Координаты точки А: '); Read(x1,y1);
  Write('Координаты точки B: '); Read(x2,y2);
  Write('Координаты точки C: '); Read(x3,y3);
  if x3=x1 then on_line:=(x2=x1);
  if (not on_line) then
    if y3=y1 then on_line:=(y2=y1);
  if not on_line then begin
    p1:=(x3-x1)/(x2-x1); p2:=(y3-y1)/(y2-y1);
    on_line:=(abs(p1-p2)<1e-8)
    end;
  if on_line then begin
    Writeln('Точки лежат на одной прямой');
    if (x2>x1) and (x2<x3) or (x2>x3) and (x2<x1)
    then Writeln('Точка B внутри')
    else
      if (x3>x1) and (x3<x2) or (x3>x2) and (x3<x1)
      then Writeln('Точка C внутри')
      else
        Writeln('Точка A внутри')
    end
  else
    Writeln('Точки не лежат на одной прямой')
end.

Тестовое решение:
Координаты точки А: 1 2.5
Координаты точки B: 3 3.5
Координаты точки C: -4 0
Точки лежат на одной прямой
Точка A внутри
0,0(0 оценок)
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота