Для решения этой задачи можно использовать алгоритм поиска в ширину (BFS) или поиск в глубину (DFS) с учетом границ между графствами. Основная цель — найти минимальное количество границ, которые необходимо пересечь, чтобы добраться от графства O до графства B.
Алгоритм:
Инициализация:
- Создайте очередь для BFS и структуры данных для хранения посещённых клеток.
- Поместите начальную позицию графства O в очередь и пометьте её как посещённую. Также создайте переменные для отслеживания текущих пересечений границ.
Поиск границ:
- Извлеките текущую позицию из очереди.
- Исследуйте соседние клетки (вверх, вниз, влево, вправо).
- Если соседняя клетка принадлежит тому же графству, что и текущая (например, O), добавьте её в очередь без увеличения счётчика границ.
- Если соседняя клетка принадлежит другому графству, увеличьте счётчик границ на 1 и поместите её в очередь.
Остановка поиска:
- Если достигнута клетка, принадлежащая графству B, запишите минимальное количество пересечённых границ.
Вывод результата.
Пример кода на Python:
from collections import deque
def min_border_crossings(n, m, grid):
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
start = end = None
# Найдите начальные и конечные позиции
for i in range(n):
for j in range(m):
if grid[i][j] == 'O':
start = (i, j)
elif grid[i][j] == 'B':
end = (i, j)
# BFS
queue = deque([(start[0], start[1], 0)]) # x, y, borders crossed
visited = set()
visited.add((start[0], start[1]))
while queue:
x, y, borders_crossed = queue.popleft()
# Если достигли графства B
if grid[x][y] == 'B':
return borders_crossed
current_county = grid[x][y]
for dx, dy in directions:
nx, ny = x + dx, y + dy
if 0 <= nx < n and 0 <= ny < m:
next_county = grid[nx][ny]
if (nx, ny) not in visited:
visited.add((nx, ny))
if next_county == current_county:
queue.append((nx, ny, borders_crossed)) # Не пересекаем границу
else:
queue.append((nx, ny, borders_crossed + 1)) # Пересекаем границу
return -1 # На всякий случай, если путь не найден (хотя по условию это невозможно)
# Чтение входных данных
n, m = map(int, input().split())
grid = [input().strip() for _ in range(n)]
# Вывод результата
result = min_border_crossings(n, m, grid)
print(result)
Объяснение кода:
- Определяются направления движения.
- Затем осуществляется поиск стартовой и конечной позиции.
- Используется очередь для BFS, где для каждой клетки хранятся координаты и количество пересечённых границ.
- Алгоритм проверяет соседние клетки, добавляя их в очередь с учётом принадлежности к графству. Если найденное графство B, выводится количество пересечённых границ.
Заключение:
Этот метод позволяет эффективно найти минимальное количество границ, которые необходимо пересечь при переходе от графства O к графству B. Попробуйте реализовать и протестировать его на ваших примерах!
