Сохраняйте мою поездку прохладной!


11

Вызов

Обойдя Маркса и Спенсера, я заметил, что у них случайно установлены кондиционеры вокруг магазина. Желая сохранять прохладу, я задавался вопросом, какой самый простой способ передвигаться по всему магазину, не оставаясь слишком долго от кондиционера.

Имея карту, вы должны найти способ путешествовать по всей карте, чтобы расстояние от кондиционера было как можно короче (даже если блок переменного тока находится на другой стороне стены).

карта

Карта может быть предоставлена ​​любым удобным вам способом и использует следующие символы:

+ is a corner of a wall
| is a east/west facing wall
- is a north/south facing wall
X is an air conditioning unit
S is the start and end point

Пример карты будет:

+------S---+
|   X      |
| ---+-+ X |
|    |X|   |
| ---+ +---+
|   X      |
+----------+

или же

+---+--+
| X |  |
|   |  +-----+------+
|   | X      | X    |
|     ---+       |  S
|   |    |  X    |  |
|   |  +-+-------+--+
| X    |
+------+

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

Сохранение максимально короткого расстояния от блока переменного тока является суммой за все временные шаги.

Проходить через означает входить и выходить.

Вы можете вывести путь любым удобным для вас способом. Примеры включают в себя:

  • Вывод карты с включенным путем
  • Вывод пути в виде последовательности точек компаса (например NNSESW)

2
@BetaDecay И как это рассчитывается? Максимальное расстояние в любой момент времени? Сумма / среднее расстояние по всем временным шагам?
Инго Бюрк

5
Невозможно понять, какова цель этой проблемы. Если вы должны посетить каждый квадрат, максимальное расстояние является постоянным.
feersum

1
@feersum Почему это? Разве расположение карты не может потребовать повторного посещения определенных квадратов и, таким образом, дает множество возможностей для прохождения пути?
InvisiblePanda

6
Это проблема оптимизации? Если нет, то должны быть несколько тестов с правильными выходами.
mbomb007

2
Не могли бы вы дать нам расстояние только для двух возможных путей для первого примера?
19

Ответы:


1

PowerShell для Windows, 376 367 байт

Как ленивый человек, я не иду на каждую полку, я перехожу от кондиционера к кондиционеру в магазине. Я считаю, что я путешествовал по всему магазину, посещая каждый кондиционер в нем.

$f={param($m,$d,$o=@{})$w=(($l=$m-split"
")|% le*|sort)[-1]
$m=($l|% *ht $w)-join"
"
if(!$o.$m-or$o.$m-ge$d-and$m-match'(?s)X.*S|S.*X'){$o.$m=$d++
$n=-split")X(S )X(.{$w}S S)X( S.{$w})X("|%{sls "(?s)^(.*$_.*)$" -inp $m -a|% m*|%{($_.Groups-replace'S',' ')[1,2]-join'S'}}
$d=(($n+,($m-replace"(?s)(?<=S(.{$w})?) | (?=(.{$w})?S)",'S')*!$n)|%{&$f $_ $d $o}|sort)[0]}+$d}

Попробуйте онлайн!

раскатали:

$f={
    param($map,$distance,$o=@{})
    $lines = $map-split"`n"
    $width = ($lines|% length|sort)[-1]
    $map = ($lines|% padRight $width)-join"`n"                              # to rectangle

    if(!$o.$map -or $o.$map-ge$distance -and $map-match'(?s)X.*S|S.*X'){
        $o.$map = $distance++                                               # store a map to avoid recalculations
        $n = -split")X(S )X(.{$width}S S)X( S.{$width})X("|%{               # search a nearest X in 4 directions
            select-string "(?s)^(.*$_.*)$" -InputObject $map -AllMatches|% Matches|%{
                ($_.Groups-replace'S',' ')[1,2]-join'S'                     # start a new segment (reset all S and replace the nearest X by S)
            }
        }
        $stepMore = $map-replace"(?s)(?<=S(.{$w})?) | (?=(.{$w})?S)",'S'
        $n += ,$stepMore*!$n                                                # add a step if X was not found
        $distance=($n|%{&$f $_ $distance $o}|sort)[0]                       # recursive repeat
    }

    +$distance
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.