Литмир - Электронная Библиотека

инициализация графа G

для каждого i от 1 до M:

ввод a, b, w

добавить ребро (a, b) со стоимостью w в граф G

вызвать алгоритм Дейкстры для поиска кратчайшего пути от вершины 1 до вершины N в графе G

вывод результат

Реализация на Python:

```python

import heapq

def dijkstra(graph, start, end):

pq = [(0, start)]

distances = {v: float('inf') for v in graph}

distances[start] = 0

while pq:

dist, node = heapq.heappop(pq)

if node == end:

return dist

if dist > distances[node]:

continue

for neighbor, weight in graph[node]:

if (new_dist := dist + weight) < distances[neighbor]:

distances[neighbor] = new_dist

heapq.heappush(pq, (new_dist, neighbor))

return -1

# Чтение входных данных

N, M = map(int, input().split())

graph = {i: [] for i in range(1, N + 1)}

for _ in range(M):

a, b, w = map(int, input().split())

graph[a].append((b, w))

graph[b].append((a, w))

# Вызов алгоритма Дейкстры для нахождения кратчайшего пути

min_cost = dijkstra(graph, 1, N)

# Вывод результата

print(min_cost)

```

Эта задача демонстрирует применение алгоритма Дейкстры для нахождения минимального пути в графе. Мы строим граф, где вершинами являются комнаты, а ребрами – проходы между комнатами с их стоимостью прохождения. Затем мы вызываем алгоритм Дейкстры для нахождения кратчайшего пути от комнаты 1 до комнаты N.

Глава 2: Задачи на числа и арифметику

1. Загадка о числовых ребусах

Условие задачи: Для решения числовых ребусов требуется найти, какие буквы представляют собой какие цифры. Каждая буква соответствует уникальной цифре от 0 до 9. Задача состоит в том, чтобы найти такие значения для каждой буквы, чтобы выполнялось правило "одна буква – одна цифра", а также чтобы все равенства в ребусе были верны.

Пример:

Ребус: SEND + MORE = MONEY

Возможное решение: 9567 + 1085 = 10652

Входные данные: Ребус в виде строки, в которой могут быть использованы буквы латинского алфавита в верхнем регистре и знаки арифметических операций (+, -, *, /), а также пробелы.

Выходные данные: Вывести решение ребуса в виде равенства, где буквы заменены на соответствующие им цифры.

Пример:

Входные данные: SEND + MORE = MONEY

Выходные данные: 9567 + 1085 = 10652

Замечание: В решении ребуса необходимо учитывать, что ведущие нули запрещены, и каждая буква соответствует уникальной цифре.

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

План решения:

1. Идентификация уникальных букв: Необходимо определить все уникальные буквы, которые встречаются в ребусе. Это поможет определить количество букв, для которых нужно найти соответствующие им цифры.

2. Перебор всех возможных комбинаций: Для каждой буквы нужно перебрать все возможные цифры от 0 до 9. Можно использовать рекурсивную функцию для генерации всех возможных комбинаций.

3. Проверка условий ребуса: Для каждой комбинации цифр нужно проверить, удовлетворяют ли они условиям ребуса. Например, сумма двух чисел должна давать третье число.

4. Вывод решения: Если найдены цифры, удовлетворяющие условиям ребуса, необходимо вывести их вместе с соответствующими буквами, образуя равенство.

5. Оптимизация: Можно использовать различные оптимизации, такие как исключение неподходящих комбинаций на ранних этапах, чтобы ускорить поиск решения.

Один из возможных способов решения задачи о числовых ребусах на основе предложенного плана:

```python

# Функция для проверки, что цифры в числе уникальны

def are_digits_unique(num):

return len(set(num)) == len(num)

# Функция для решения числового ребуса

def solve_rebus(rebus):

# Извлекаем уникальные буквы из ребуса

unique_chars = set(char for char in rebus if char.isalpha())

# Генерируем все возможные комбинации цифр для уникальных букв

for digits in itertools.permutations('0123456789', len(unique_chars)):

digits_str = ''.join(digits)

# Проверяем, что ведущие нули отсутствуют и цифры уникальны

if digits_str[0] != '0' and are_digits_unique(digits_str):

# Заменяем буквы на соответствующие цифры в ребусе

rebus_with_digits = rebus.translate(str.maketrans({char: digit for char, digit in zip(unique_chars, digits_str)}))

# Разделяем ребус на левую и правую части

left, right = rebus_with_digits.split('=')

# Проверяем, удовлетворяет ли решение ребусу

if eval(left) == eval(right):

return rebus_with_digits

return None

# Пример использования

rebus = "SEND + MORE = MONEY"

solution = solve_rebus(rebus)

if solution:

print(solution)

else:

print("Решение не найдено.")

```

Этот код генерирует все возможные комбинации цифр для уникальных букв в ребусе, заменяет буквы на соответствующие цифры в ребусе и проверяет, удовлетворяет ли полученное выражение условиям ребуса. Если находится решение, оно выводится на экран.

Объяснения к коду:

1. Функция `are_digits_unique`:

– Эта функция принимает строку `num`, представляющую число в виде строки.

– Внутри функции используется `set`, чтобы преобразовать строку в множество уникальных символов.

– Функция возвращает `True`, если количество символов в строке `num` совпадает с количеством уникальных символов, что означает, что все цифры в числе уникальны. В противном случае функция возвращает `False`.

2. Функция `solve_rebus`:

– Эта функция принимает строку `rebus`, представляющую собой числовой ребус.

– Она начинается с извлечения уникальных букв из ребуса с помощью функции `set` и условия `char.isalpha()`. Таким образом, `unique_chars` содержит все уникальные буквы, встречающиеся в ребусе.

– Затем функция перебирает все возможные перестановки цифр от 0 до 9 с помощью функции `itertools.permutations`, указывая количество цифр, соответствующее количеству уникальных букв в ребусе.

– Для каждой перестановки цифр функция проверяет, что ведущий ноль отсутствует, вызывая `digits_str[0] != '0'`, и что все цифры уникальны, вызывая функцию `are_digits_unique`.

– Если эти условия выполнены, функция заменяет буквы на соответствующие цифры в ребусе с помощью метода `str.translate` и словаря, созданного с помощью `zip`.

– Затем ребус разбивается на левую и правую части с помощью метода `split('=')`.

– После этого проверяется, является ли результат левой части равенства (`eval(left)`) равным результату правой части (`eval(right)`).

– Если это так, то функция возвращает ребус с замененными буквами на цифры. Если не найдено ни одного решения, функция возвращает `None`.

3. Пример использования:

– В примере использования задается ребус `"SEND + MORE = MONEY"`.

– Функция `solve_rebus` вызывается с этим ребусом.

– Если найдено решение, оно выводится на экран. Если решение не найдено, выводится сообщение "Решение не найдено."

2. Магические квадраты

Описание задачи: Магический квадрат – это квадратная матрица размером (n \times n), заполненная числами от 1 до (n^2) таким образом, что суммы чисел в каждой строке, каждом столбце и обеих диагоналях равны.

Ваша задача – написать программу, которая проверяет, является ли данная матрица магическим квадратом.

Формат ввода:

– В первой строке задается одно целое число (n) ((1 leq n leq 100)) – размерность матрицы.

– В следующих (n) строках содержится по (n) целых чисел, разделенных пробелами, – элементы матрицы.

4
{"b":"897161","o":1}