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

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

30.12.2024, 18:32. Показов 963. Ответов 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,304
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,304
02.01.2025, 23:54
Почему получается бесконечный ввод данных????
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
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,304
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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru