Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
-13 / 0 / 0
Регистрация: 12.11.2023
Сообщений: 41

Олимпиадная задача про лабиринт

30.12.2024, 18:32. Показов 1032. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Наташа решила в выходные пойти на очередной квест в реальности. Но квест оказался необычным. Наташа оказалась в лабиринте, с картой лабиринта на руках. На карте есть точка, куда она должны прийти, тогда квест считается пройденным, а за прохождение с максимальной скоростью, она получит ценный приз.

На карте отмечена точка нахождения Наташи и сам лабиринт.

Наташа очень хочет получить ценный приз, но она не знает, как проходить лабиринт быстро, потому вспомнила правило «правой руки». Она сразу же поставила правую руку на стену и пошла по лабиринту. Помогите понять, через сколько клеток Наташа сможет дойти до конечной точки, а если не сможет, то через сколько клеток она вернётся на ту же клетку, с которой начинала прохождение лабиринта.



Входные данные:

На первой строке подаётся размер лабиринта N, M (1 <= N, M <= 1000), где N – количество строк в лабиринте, M – количество столбцов.

На второй строке подаётся цифра – направление взгляда Наташи в лабиринте (от 1 до 4): (Прикрепленный снимок)


Далее на N строках подаётся по M параметров, задающих лабиринт, где

· “x” – это клетка, в которую нельзя пройти;

· “f” – это точка, до которой должны добраться девочки;

· “1” – точка, где находится Наташа.



Выходные данные:

Вывести на одной строке – количество клеток, которое понадобится пройти Наташе, чтобы добраться до точки финиша, либо, если добраться по принципу «правой руки» невозможно, то вывести минимальное количество клеток, которые пройдёт Наташа, прежде чем вернётся в изначальную точку, с которой начинала прохождение.



Примечание:

· граница всего лабиринта всегда стена;

· если Наташа приходит в тупик и для разворота она кружится на месте, то это не идёт в счёт пройденных клеток;

· Наташа всегда первоначально находится у стены.


Входные данные:
9 15
2
xxxxxxxxxxxxxxx
x0x10xxx000000x
x0xx0x00000000x
x0000x0xxxxxxxx
xxx0xx00000000x
x000000xxxxxxxx
x0000x00000000x
x0000x00f00000x
xxxxxxxxxxxxxxx
Выходные данные:
29

(См. прикр. фото)
Миниатюры
Олимпиадная задача про лабиринт  
Изображения
 
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.12.2024, 18:32
Ответы с готовыми решениями:

Олимпиадная задача
Кто решит, скину 500 рублей на карту. ОЧЕНЬ СРОЧНО!

Олимпиадная задача
Выглядит она так:

Олимпиадная задача
В турнире участвуют N команд. Турнир проводится по олимпийской системе (команды играют на вылет, проигравшие команды выбывают из турнира,...

4
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,329
02.01.2025, 15:22
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
def solve():
    n, m = map(int, input().split())
    start_direction = int(input())
    labyrinth = []
    for _ in range(n):
        labyrinth.append(list(input()))
 
    start_row, start_col = -1, -1
    finish_row, finish_col = -1, -1
 
    for r in range(n):
        for c in range(m):
            if labyrinth[r][c] == '1':
                start_row, start_col = r, c
            elif labyrinth[r][c] == 'f':
                finish_row, finish_col = r, c
 
    current_row, current_col = start_row, start_col
    current_direction = start_direction
    visited = set()
    steps = 0
 
    while True:
        visited.add((current_row, current_col))
        steps += 1
 
        if current_row == finish_row and current_col == finish_col:
            print(steps)
            return
 
        # Find next cell using right-hand rule
        next_row, next_col = current_row, current_col
        found_next = False
        for i in range(4):
            next_direction = (current_direction + i) % 4
            if next_direction == 0:  # Up
                next_row = current_row - 1
                next_col = current_col
            elif next_direction == 1:  # Down
                next_row = current_row + 1
                next_col = current_col
            elif next_direction == 2:  # Left
                next_row = current_row
                next_col = current_col - 1
            elif next_direction == 3:  # Right
                next_row = current_row
                next_col = current_col + 1
 
            if 0 <= next_row < n and 0 <= next_col < m and labyrinth[next_row][next_col] != 'x':
                current_row, current_col = next_row, next_col
                current_direction = next_direction
                found_next = True
                break
 
        if not found_next:  # If we are in a dead end
            if (current_row, current_col) == (start_row, start_col) and steps > 1:
                print(steps)
                return
 
            # Try to turn around
            current_direction = (current_direction + 2) % 4  # Turn 180 degrees
 
 
solve()
Добавлено через 7 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
def right_hand_rule(labyrinth, start_pos, start_dir):
    # Определяем направления: 1 - вверх, 2 - вправо, 3 - вниз, 4 - влево
    directions = {
        1: (-1, 0),  # вверх
        2: (0, 1),  # вправо
        3: (1, 0),  # вниз
        4: (0, -1)  # влево
    }
 
    # Повороты направлений (правый поворот)
    right_turn = {
        1: 2,
        2: 3,
        3: 4,
        4: 1
    }
 
    # Повороты направлений (левый поворот)
    left_turn = {
        1: 4,
        2: 1,
        3: 2,
        4: 3
    }
 
    # Установим начальные значения
    current_pos = start_pos
    current_dir = start_dir
    visited = set()  # Множество для хранения посещенных клеток
    steps = 0
 
    while True:
        if current_pos in visited:
            return steps, "loop"  # Вернуться в исходную точку
 
        visited.add(current_pos)
 
        # Проверка на достижение финиша
        if labyrinth[current_pos[0]][current_pos[1]] == 'f':
            return steps, "finish"
 
        # Определяем новое направление по правой руке
        right_direction = right_turn[current_dir]
 
        # Проверяем возможность движения в направлении "правой руки"
        right_move = (current_pos[0] + directions[right_direction][0],
                      current_pos[1] + directions[right_direction][1])
 
        if labyrinth[right_move[0]][right_move[1]] != 'x':  # Если можно пройти
            current_pos = right_move
            current_dir = right_direction
            steps += 1
        else:
            # Если нельзя пройти, поворачиваем налево
            current_dir = left_turn[current_dir]
            # Проверяем движение вперед по текущему направлению
            forward_move = (current_pos[0] + directions[current_dir][0],
                            current_pos[1] + directions[current_dir][1])
 
            if labyrinth[forward_move[0]][forward_move[1]] != 'x':  # Если можно пройти
                current_pos = forward_move
                steps += 1
            else:
                # Если никуда не можем пойти, остаемся на месте (не учитываем шаг)
                continue
 
 
# Чтение входных данных
N, M = map(int, input().strip().split())
start_direction = int(input().strip())
labyrinth =[list(input().strip()) for _ in range(N)]
 
# Поиск начальной позиции Наташи
start_pos = None
 
for i in range(N):
    for j in range(M):
        if labyrinth[i][j] == '1':
            start_pos = (i, j)
            break
    if start_pos:
        break
 
# Запускаем алгоритм
steps, result_type = right_hand_rule(labyrinth, start_pos, start_direction)
 
if result_type == "finish":
    print(steps)
else:
    print(steps)
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,329
02.01.2025, 23:54
Почему получается бесконечный ввод данных????
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,329
05.01.2025, 00:29
Почему выдает 1 вместо 29????
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
def main():
    import sys
    from collections import deque
 
    # Чтение входных данных
    N, M = map(int, sys.stdin.readline().split())
    direction = int(sys.stdin.readline())
    maze =[list(sys.stdin.readline().strip()) for _ in range(N)]
 
    # Находим начальную позицию Наташи
    start_pos = None
    for i in range(N):
        for j in range(M):
            if maze[i][j] == '1':
                start_pos = (i, j)
                break
        if start_pos:
            break
 
    # Направления: 1 - вверх, 2 - вправо, 3 - вниз, 4 - влево
    directions = [(-1, 0), (0, 1), (1, 0), (0, -1)]
    dir_idx = direction - 1
 
    # Начальная позиция и направление
    x, y = start_pos
    visited = set()
    steps = 0
 
    while True:
        if (x, y) in visited:
            # Если вернулись в начальную точку, выводим количество шагов
            print(steps)
            return
        visited.add((x, y))
 
        # Проверяем, достигли ли мы финиша
        if maze[x][y] == 'f':
            print(steps)
            return
 
        # Пытаемся двигаться вперёд
        nx, ny = x + directions[dir_idx][0], y + directions[dir_idx][1]
        if 0 <= nx < N and 0 <= ny < M and maze[nx][ny] != 'x':
            x, y = nx, ny
            steps += 1
        else:
            # Если нельзя двигаться вперёд, поворачиваем направо
            dir_idx = (dir_idx + 1) % 4
 
if __name__ == "__main__":
    main()
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,329
06.01.2025, 21:25
В принципе решение найдено.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.01.2025, 21:25
Помогаю со студенческими работами здесь

Олимпиадная задача
Петя живет в одной далекой галактике, где n дней в году, а ещё у Пети много друзей, которым он дарит подарки, ему приходится записывать...

Олимпиадная задача
Пожалуйста помогите решить задачу В кабинете в три ряда стоят парты. Всего парт N, где N кратно 3. За каждой партой два рабочих места...

Олимпиадная задача
Привет, никак не могу решить задачу, код в голову не приходит, может кто подскажет как? Всего в одном месяце n дней. Вы знаете, что в...

Олимпиадная задача на подбор
Всем привет. В олимпиаде попалась задача &quot;Очередная задача про три числа&quot;. Одно из главных условий: все должно уложиться в 1 секунду. ...

Олимпиадная задача на движение
Два студента колледжа хотят приходить на занятия вместе. Но живут они на разном расстоянии от колледжа. К счастью, они знают и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru