У Глеба есть зоопарк, который имеет форму круга. Ваша задача - поймать всех животных, которые разбежались по зоопарку

  • 50
У Глеба есть зоопарк, который имеет форму круга. Ваша задача - поймать всех животных, которые разбежались по зоопарку, и вернуть их обратно в клетки. В зоопарке находится n животных разных видов, принадлежащих к одному из 26 видов. Время выполнения ограничено 1 секундой, а доступная память - 256 мегабайт. Ввод осуществляется через стандартный ввод или файл input.txt, а вывод должен быть записан в стандартный вывод или файл output.txt.
Donna
38
Чтобы решить данную задачу, мы можем использовать алгоритм поиска в ширину (BFS, breadth-first search). Давайте рассмотрим шаги алгоритма:

1. Создаем переменную `visited`, чтобы отслеживать, посещали ли мы данную клетку в зоопарке.
2. Создаем переменную `queue`, которая функционирует как очередь. Начинаем с добавления всех клеток, содержащих животных, в эту очередь.
3. Создаем переменную `steps`, которая будет отслеживать количество шагов, необходимых для вернуть всех животных в клетки.
4. Создаем переменную `directions`, которая содержит массив из смещений для перемещения по соседним клеткам в зоопарке (вправо, влево, вверх, вниз).
5. Запускаем цикл, пока очередь `queue` не пуста:
1. Извлекаем первую клетку из очереди.
2. Если данная клетка уже была посещена, пропускаем данный шаг.
3. Иначе, отмечаем данную клетку как посещенную в `visited`.
4. Если животное в данной клетке принадлежит к одному из 26 видов, удаляем его из зоопарка, увеличивая таким образом `steps` на 1.
5. Для каждого смещения `dir` в `directions`:
1. Вычисляем новые координаты клетки после смещения.
2. Если новые координаты находятся в пределах зоопарка и данная клетка не была посещена, добавляем ее в `queue`.
6. Возвращаем значение `steps`, которое содержит количество шагов, необходимых для вернуть всех животных в клетки.

Ниже приведена реализация данного алгоритма на языке Python:

python
from collections import deque

def catch_animals(n, zoo):
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
visited = set()
queue = deque()
steps = 0

for i in range(n):
queue.append(zoo[i])

while queue:
cell = queue.popleft()
if cell in visited:
continue
visited.add(cell)

if cell[0] != ".":
steps += 1

for dir in directions:
new_row = cell[1] + dir[0]
new_col = cell[2] + dir[1]
new_cell = (cell[0], new_row, new_col)

if 0 <= new_row < len(zoo) and 0 <= new_col < len(zoo[0]) and new_cell not in visited:
queue.append(new_cell)

return steps


Данная функция `catch_animals` принимает на вход количество животных `n` и массив `zoo`, представляющий зоопарк. Каждая клетка зоопарка имеет формат `(животное, строка, столбец)`. Функция возвращает количество шагов `steps`, необходимых для вернуть всех животных в клетки.

Для решения данной задачи необходимо будет использовать стандартный ввод и вывод. Пример такого кода:

python
n = int(input())
zoo = []

for _ in range(n):
animal, row, col = input().split()
zoo.append((animal, int(row), int(col)))

result = catch_animals(n, zoo)
print(result)


Данный код считывает ввод с помощью функции `input()` и передает его в функцию `catch_animals`, а затем выводит результат с помощью функции `print()`. Необходимо учесть, что все необходимые проверки на корректность ввода и обработку исключений были опущены из примера для простоты.