Тримай мою подорож крутою!


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
Не могли б ви дати нам відстань для єдиного двох можливих шляхів подорожі для першого прикладу?
mdahmoune

Відповіді:


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.