旅行をクールに!


11

チャレンジ

マークスとスペンサーを歩いていると、店の周りにエアコンユニットがランダムに配置されていることに気付きました。冷静を保ちたいと思った私は、エアコンユニットから離れすぎずに店全体を動き回る最も簡単な方法は何だろうと考えました。

マップが与えられたら、エアコンユニットからの距離をできるだけ短く保ちながら、マップ全体を移動する方法を見つける必要があります(ACユニットが壁の反対側にある場合でも)。

地図

マップは任意の方法で提供でき、次の記号を使用します。

+ 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    |
+------+

マップ全体を移動するということは、すべての空きスペースとエアコンを通過することを意味します。壁を通過することはできず、直交方向にのみ移動できます。マップは常に長方形であるとは限りません。

ACユニットからの距離をできるだけ短くすることは、すべてのタイムステップの合計です。

パススルーとは、出入りを意味します。

任意の方法でパスを出力できます。例は次のとおりです。

  • パスを含めてマップを出力する
  • コンパスポイントの連続としてパスを出力(例NNSESW

2
@BetaDecayそして、それはどのように計算されますか?ある時点での最大距離は?すべての時間ステップにわたる距離の合計/平均?
インゴバーク14年

5
この問題の目的を理解することは不可能です。すべての広場を訪れる必要がある場合、最大距離は一定です。
feersum

1
@feersumそれはなぜですか?マップレイアウトでは、特定の正方形を再訪する必要があり、パスに複数の可能性を与えることができませんでしたか?
InvisiblePanda 14年

6
これは最適化の問題ですか?そうでない場合は、正しい出力のテストケースがいくつかあるはずです。
mbomb007 16

2
最初の例のたった2つの可能な移動方法の距離を教えていただけますか?
mdahmoune

回答:


1

PowerShell for 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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.