Вы являетесь железнодорожным предпринимателем в Соединенных Штатах 19-го века, когда поезда становятся популярными, потому что они являются наиболее эффективным средством транспортировки больших объемов материалов по суше. Существует национальная потребность в железнодорожных путях от восточного побережья через некоторые недавно колонизированные земли на западе.
Чтобы удовлетворить эту потребность, правительство США собирается взимать налог на субсидирование железных дорог. Они обещали заплатить деньги вашей железнодорожной компании за каждую пройденную милю пути. Так как укладка дорожек в холмистых и горных районах обходится дороже, чем укладка дорожек на равнине, они соответственно корректируют количество, которое дают. То есть правительство будет платить
- 5000 долларов за милю трассы, проложенной на равнине
- $ 12500 за милю трассы, проложенной в холмистой местности
- 20 000 долларов за милю трассы, проложенной в горах.
Конечно, этот план не точно отражает, сколько на самом деле стоит заложить треки.
Вы наняли нескольких картографов, чтобы нарисовать рельефные карты регионов, где вы будете прокладывать трассу для анализа высоты. Вот одна из таких карт:
S12321
121234
348E96
Каждая цифра представляет одну квадратную милю земли. S
является отправной точкой, E
является конечной точкой. Каждое число представляет интенсивность изменений высоты в этом регионе.
- Земля с номерами 1-3 представляет собой равнину.
- Земля с номерами 4-6 составляет холмистую землю.
- Земля с номерами 7-9 составляет горный массив.
По многолетнему опыту строительства железнодорожных путей вы оценили, что стоимость строительства путей (в долларах) удовлетворяет следующей формуле:
Cost_Per_Mile = 5000 + (1500 * (Elevation_Rating - 1))
Это означает, что построение на определенных градиентах будет стоить вам больше денег, чем правительство, иногда это будет выгодно, а иногда вы просто безубыточны.
Например, километр трассы с градиентом возвышения 3 стоит 8000 долларов на строительство, но вам платят только 5000 долларов, поэтому вы теряете 3000 долларов. В отличие от этого, строительство километра трассы с градиентом возвышения, равным 7, стоит 14 000 долларов, но за это вам платят 20 000 долларов: прибыль в 6000 долларов!
Вот пример карты, а также два разных возможных пути.
S29 S#9 S##
134 1#4 1##
28E 2#E 2#E
Первый трек стоит 30000 долларов, но правительство платит за него 30000 долларов. Вы не получаете прибыль от этого трека.
С другой стороны, строительство второго стоит 56 500 долларов, но за это вам платят 62 500 долларов. Вы получаете $ 6000 с этого трека.
Ваша цель: с помощью рельефной карты найти наиболее выгодный (или, возможно, просто наименее дорогой) путь от начала до конца. Если несколько путей связаны, любой из них является приемлемым решением.
Детали программы
Вам предоставляется ввод текста, разделенный прямоугольной картой чисел и одной начальной и конечной точкой. Каждое число будет целым числом от 1 до 9. Кроме этого, ввод может быть предоставлен, как вам угодно, в пределах разумного.
Выходные данные должны быть в том же формате, что и входные данные, а номера, в которых была построена дорожка, заменены на hash ( #
). Из-за произвольных правил, введенных некоторыми капризными политиками, треки могут идти только по горизонтали или вертикали. Другими словами, вы не можете вернуться назад или идти по диагонали.
Программа должна быть в состоянии решить за разумное время (то есть <10 минут) для карт до 6 строк и 6 столбцов.
Это кодовое соревнование по гольфу , поэтому выигрывает самая короткая программа.
У меня есть пример (не в гольф) реализации .
Образец ввода / вывода
S12321
121234
348E96
S12321
######
3##E##
S73891
121234
348453
231654
97856E
S#3###
1###3#
3#####
######
#####E
источник
4
в134
примере карта быть6
?Ответы:
Питон, 307 символов
P
принимает частичный путьp
и возвращает все пути его расширения для достиженияE
. Каждый возвращаемый путь связан со своим счетом, поэтомуmax
можно найти лучший.Занимает около 80 секунд на карте 6х6.
источник
Python:
529482460 байтМое решение не выиграет никаких призов. Однако, поскольку опубликовано только два решения, и я нашел проблему интересной, я все равно решил опубликовать свой ответ.
Редактировать: Спасибо Говарду за его рекомендации. Мне удалось побрить большую часть моего счета!
источник
P
иM
используются только по одному разу, поэтому рекомендуется встроить их в одну строку (для одного вызова он работает почти во всех случаях для двух иногда).m[c]!='S'
может быть сокращено доm[c]<'S'
, такжеabs(z)==1
доabs(z)<2
или даже-2<z<2
.Рубин, 233 символа
Рубиновый метод грубой силы, который хорошо работает в условиях ограничения времени на доске 6х6. Ввод должен быть дан на STDIN.
Примеры:
источник