Задача
По периметру большого прямоугольного зала устроены небольшие ниши, отделённые друг от друга стенами. Роботу надо обойти все эти ниши. Для начала надо научить его двигаться вдоль одной стены. Напишите программу, которая позволит роботу перейти в следующую по часовой стрелке нишу (клетку) и покрасить её.
Чтобы научить робота двигаться по периметру прямоугольного зала и переходить в следующую нишу (клетку) по часовой стрелке, нам нужно рассмотреть, как организовать эту программу. Начнем с понимания, что мы имеем дело с двумерной матрицей, где ниши располагаются по периметру.
### Пошаговое решение:
1. **Представление зала**:
Будем считать, что зал представлен двумерным массивом (матрицей), где `0` обозначает пустую нишу, а `1` — занятую нишу (стену).
Пример:
```
[
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 1],
[1, 0, 1, 0, 1],
[1, 0, 0, 0, 1],
[1, 1, 1, 1, 1]
]
```
2. **Определяем движение**:
Робот должен двигаться по периметру по часовой стрелке. Чтобы сделать это, мы можем определить направление движения (вправо, вниз, влево, вверх) и соответствующие изменения индексов вершины. Начнем с верхнего левого угла.
3. **Направления движения**:
Мы можем определить массив направлений как:
```python
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] # вправо, вниз, влево, вверх
```
4. **Алгоритм**:
- Начнем с заданной начальной позиции.
- Проверяем текущую нишу. Если она пустая, робот ее "покрасит" (например, изменим значение на `1`).
- Двигаемся в направлении по часовой стрелке.
- Если в новом положении ниша занята (стена), изменяем направление движения и продолжаем.
- Продолжаем до тех пор, пока не обойдем все ниши.
### Пример кода на Python:
```python
def paint_and_move(room):
rows = len(room)
cols = len(room[0])
# Начальная позиция
x, y = 1, 1 # Предполагается, что начинаем с первой ниши
# Направления: вправо, вниз, влево, вверх
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
direction_index = 0 # Начнем с вправо
for _ in range((2 * (rows + cols - 2))): # Периметр
# Если ниша пустая, покрасим
if room[x][y] == 0:
room[x][y] = 1 # Покрасили нишу
print(f"Покрасили нишу на позиции ({x}, {y})")
# Двигаемся дальше
next_x = x + directions[direction_index][0]
next_y = y + directions[direction_index][1]
# Проверим границы и наличие стены
if (0 <= next_x < rows and 0 <= next_y < cols and room[next_x][next_y] == 0):
x, y = next_x, next_y
else: # Изменяем направление
direction_index = (direction_index + 1) % 4
x += directions[direction_index][0]
y += directions[direction_index][1]
# Пример использования
room = [
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 1],
[1, 0, 1, 0, 1],
[1, 0, 0, 0, 1],
[1, 1, 1, 1, 1]
]
paint_and_move(room)
```
### Объяснение кода:
- Мы задаем матрицу `room` и функции `paint_and_move`, которая отвечает за движение и покраску ниш.
- Мы определяем начальные координаты и массив направлений для движения по периметру.
- После того как мы "красим" нишу (изменяя значение в матрице), проверяем, можем ли подвинуться в текущее направление. Если не можем, изменяем направление.
- Таким образом, бот последовательно обходит все ниши по периметру, покрашивая их.
Этот простейший алгоритм помогает боту выполнить поставленную задачу.