保持旅行愉快!


11

挑战

我在Marks and Spencers周围走来走去,发现他们在商店周围随机放置了空调。为了保持凉爽,我想知道在不离开空调装置太长时间的情况下在整个商店中移动的最简单方法是什么。

在给定地图的情况下,您必须找到一种在整个地图上行驶的方法,以保持与空调单元的距离尽可能短(即使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    |
+------+

在整个地图上旅行意味着要穿过每个空的空间和空调。您不能穿过墙壁,而只能正交。地图可能并不总是矩形的。

与交流单元的距离应尽可能短,这是所有时间步长的总和。

通过意味着进入和离开。

您可以按照自己喜欢的任何方式输出路径。示例包括:

  • 输出包含路径的地图
  • 将路径输出为连续的罗盘点(例如NNSESW

2
@BetaDecay这是如何计算的?在任何时间点的最大距离?所有时间步长的距离之和/平均值?
IngoBürk'14

5
无法理解此问题的目的是什么。如果您必须访问每个广场,则最大距离是一个常数。
feersum 2014年

1
@feersum为什么?地图布局是否有必要重新审视某些正方形,从而为路径提供多个可能性?
InvisiblePanda 2014年

6
这是优化问题吗?如果没有,应该有一些输出正确的测试用例。
mbomb007'2013/

2
您能否为第一个示例提供仅两种可能的行驶方式的距离?
mdahmoune

Answers:


1

Windows的PowerShell376 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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.