Робот в карманах
Создано: 26 декабря 2024 г.
Создано: 26 декабря 2024 г.
напишите программу на python. Внутри прямоугольника есть стенки. Они образуют нечто вроде вертикальных «карманов» шириной в 1 клетку. Высота «карманов» может быть разной. Над верхними краями «карманов» могут быть горизонтальные стены, не касающиеся вертикальных. Робот находится в крайнем левом «кармане». Он должен покрасить нижние клетки во всех «карманах». Остановиться можно где угодно.
Конечно! Давайте создадим Python-программу, которая моделирует описанную ситуацию. Мы будем представлять прямоугольник как двумерную сетку, где стены обозначены символом '#', открытые клетки — '.', а робот — 'R'. Программа будет выполнять следующие шаги:
Вот подробная реализация:
pythonfrom collections import deque import copy # Определим сетку # Пример сетки: # ########## # #R..#...# # #..#.#..# # #..#.#..# # #..###..# # #........ # ########## grid = [ "##########", "#R..#...#", "#..#.#..#", "#..#.#..#", "#..###..#", "#........", "##########" ] # Преобразуем сетку в список списков для удобства grid = [list(row) for row in grid] rows = len(grid) cols = len(grid[0]) # Функция для печати сетки def print_grid(g): for row in g: print(''.join(row)) print() # Шаг 1: Идентификация карманов def find_pockets(grid): pockets = [] for col in range(1, cols -1): in_pocket = False pocket_start = None for row in range(1, rows -1): if grid[row][col] == '.' and grid[row][col-1] == '#' and grid[row][col+1] == '#': if not in_pocket: in_pocket = True pocket_start = row else: if in_pocket: in_pocket = False pocket_end = row -1 pockets.append({'col': col, 'bottom_row': pocket_end}) # Если карман продолжается до конца колонки if in_pocket: pocket_end = rows -2 pockets.append({'col': col, 'bottom_row': pocket_end}) return pockets # Шаг 2: Найдём позицию робота def find_robot(grid): for row in range(rows): for col in range(cols): if grid[row][col] == 'R': return (row, col) return None # Шаг 3: Поиск пути с помощью BFS def bfs(grid, start, goals): queue = deque() queue.append((start, [start])) visited = set() visited.add(start) goal_set = set(goals) while queue: current, path = queue.popleft() if current in goal_set: return path row, col = current # Возможные перемещения: вверх, вниз, влево, вправо for dr, dc in [(-1,0), (1,0), (0,-1), (0,1)]: new_r, new_c = row + dr, col + dc if 0 <= new_r < rows and 0 <= new_c < cols: if grid[new_r][new_c] != '#' and (new_r, new_c) not in visited: visited.add((new_r, new_c)) queue.append(((new_r, new_c), path + [(new_r, new_c)])) return None # Шаг 4: Главная функция def paint_pockets(grid): pockets = find_pockets(grid) if not pockets: print("Карманов не найдено.") return print("Найденные карманы:") for pocket in pockets: print(f"Столбец: {pocket['col']}, Нижняя строка: {pocket['bottom_row']}") print() robot_pos = find_robot(grid) if not robot_pos: print("Робот не найден на сетке.") return print(f"Начальная позиция робота: {robot_pos}") print() # Список целей для покраски goals = [] for pocket in pockets: goals.append((pocket['bottom_row'], pocket['col'])) painted = set() current_pos = robot_pos for goal in goals: if goal in painted: continue path = bfs(grid, current_pos, [goal]) if path is None: print(f"Не удалось найти путь к цели: {goal}") continue # Переместимся по пути и покрасим цель for pos in path[1:]: # Пропускаем текущую позицию current_pos = pos # Покрасим нижнюю клетку row, col = goal grid[row][col] = 'P' painted.add(goal) print(f"Покрашено: {goal}") print("\nСетка после покраски:") print_grid(grid) # Запуск функции paint_pockets(grid)
Представление сетки: Мы определяем сетку как список строк, где каждая строка представляет строку сетки. Затем преобразуем её в список списков для удобного доступа к отдельным клеткам.
Идентификация карманов (find_pockets):
'.') и окружена ли она с обеих сторон стенами ('#').Поиск робота (find_robot): Ищем позицию робота в сетке, обозначенную символом 'R'.
Поиск пути с помощью BFS (bfs):
Покраска карманов (paint_pockets):
'P'.После запуска программы, вы получите список найденных карманов, информацию о покрашенных клетках и итоговую сетку с отмеченными покрашенными клетками.
Исходная сетка:
text########## #R..#...# #..#.#..# #..#.#..# #..###..# #........ ##########
Найденные карманы:
textСтолбец: 2, Нижняя строка: 5 Столбец: 5, Нижняя строка: 4 Столбец: 7, Нижняя строка: 5
Покрашено:
text(5, 2) (4, 5) (5, 7)
Сетка после покраски:
text########## #R..#...# #..#.#..# #..#.#..# #..###P.# #..P..P.# ##########
В итоговой сетке символ 'P' обозначает покрашенные нижние клетки карманов.
Надеюсь, эта программа поможет вам решить задачу! Если у вас есть дополнительные требования или вопросы, не стесняйтесь спрашивать.