|
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
|
|||||||||||||
Кратчайший путь из одной вершины в другую с условием, что двигаться можно только прямо и вправо15.02.2017, 18:47. Показов 1925. Ответов 2
Метки нет (Все метки)
Задача
Условие Змей Горыныч оказался в лабиринте и хочет выбраться из него как можно скорее. К сожалению, после вчерашнего употребления кефира, левая голова Змея соображает плохо. Поэтому Змей Горыныч может поворачивать направо и идти прямо, но не может поворачивать налево и разворачиваться на месте. Помогите Змею Горынычу определить длину кратчайшего пути до выхода из лабиринта. Входные данные В первой строке через пробел записаны числа r и c (4 ≤ r, c ≤ 20) - количество строк и столбцов в карте лабиринта. В каждой из следующих r строк записано по c символов, задающих эту карту. Символ S обозначает положение Змея Горыныча, символ F - точку выхода из лабиринта, символ X - стенку. Пробелами обозначены проходимые клетки. Гарантируется, что лабиринт окружен стенами. Перед началом движения Змей Горыныч может сориентироваться по любому из 4 направлений (вверх, вниз, влево или направо). Выходные данные Выведите единственное число - расстояние, которое придется пройти Змею Горынычу. Гарантируется, что он всегда сможет выйти из лабиринта. Пример Поиск в ширину - сделал, счётчик ходов - сделал, но проблема в другом. Эта проблема особенно видна, если сделать пустое поле максимального размера (20х20), и поставить Змея Горыныча в левый нижний угол, а выход в правый верхний, а потом запустить программу, то после 40 секунд, она вылетит с ошибкой bad_alloc. Да, да, она самая, но на этот раз проблема не в ней, потому что если немного разобраться, всё становится ясно: перед вылетом в очередях более 170 миллионов элементов, и это количество только растёт. Я могу сказать, почему. У моей программы нет тормозов. Я не могу придумать правило, которое не даст Змею Горынычу делать ненужные движения. Вернее могу, я придумал, даже несколько, но все они не работают. В коде я вам представил самое, на мой взгляд, удачное решение, к которму я не могу придумать контр-тесты, но сайт его бракует, выдавая два правильных ответа из семи. Это первая и единственная проблема, которую я заметил.
Теперь постараюсь объяснить мой код. Начну снизу вверх. 1. Функция labyrinthReadФункция labyrinthRead необходима для правильного чтения массива. Она сдвигает каретку на начало поля и начинает считывать посимовльно. В зависимости от символа, вставляет в массив labyrinth нужную цифру. -1 - если стенка0 - если пустое место, или там стоит Змей Горыныч (так же записывает координаты в start_i и start_j)1 - если здесь стоит выход (так же записывает координаты в finish_i и finish_j)2. Функция pushSidesЗдесь уже сложнее. Так как правая сторона будет разной относительно тех сторон, куда повёрнута голова Змея Горыныча. Я решил их пронумеровать вот так Вложение 799192 Стрелка - это сторона, в которую повёрнута голова Змея, соответственно для каждой стороны своя правая сторона. В функцию я передал три очереди, первые две - координаты, третья - сторона, в которую при этом должен быть повёрнут Змей Горыныч. Далее, функция, в зависимости от стороны side, проверяет, есть ли на пути стена и добавляет две пары координат, прямо и направо.3.Функция bfsТут всё просто: беру вершину, записываю для неё пару вершин, удаляю эту вершину. И так, пока не найду выход Объясняю правило Тупым правилом "был в этой клетке, значит больше и не надо в ней быть" здесь не обойтись. Как видно по примеру в условии, он должен и будет наматывать круги по всей площади. Так что я не смог придумать ничего лучше, как записывать в отдельный массив positions ту позицию, из которой я в него попал. И сделать проверку: если позиция из которой туда попали совпадает с текущей, то условие ложно и в очередь ничего не добавляется. Сидел над этой задачей часов восемь. Перепроверил всё что только можно(и ещё раз проверил в процессе написания этого поста), надеюсь на вашу помощь. Добавлено через 5 минут Тест на котором программа не идёт
0
|
|||||||||||||
| 15.02.2017, 18:47 | |
|
Ответы с готовыми решениями:
2
С помощью метода волны найти кратчайший путь из одной клетки в другую (ход конём) Найти кратчайший путь из вершины u в вершину v Алгоритм Дейкстры - Найти кратчайший путь от 1 вершины |
|
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
|
|
| 15.02.2017, 18:49 [ТС] | |
|
Почему-то скриншот не отобразился, вот он:
0
|
|
|
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
|
|||||||||||
| 18.02.2017, 22:32 [ТС] | |||||||||||
|
Задача решена, проблема была в функции
labyrinthRead.Эта часть оказалась проблемной
1
|
|||||||||||
| 18.02.2017, 22:32 | |
|
Помогаю со студенческими работами здесь
3
Определить кратчайший путь от начальной вершины к конечной Программа, способная отвечать на запросы и возвращать кратчайший путь до заданной вершины
Как только что установлений AUTO_INCREMENT записать из одной таблици в другую? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes.
А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения
развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит:
токи, напряжения и их 1 и 2 производные при t = 0;. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|