ทำให้การเดินทางของฉันเย็น!


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

การเดินทางรอบแผนที่ทั้งหมดหมายถึงการผ่านทุกที่ว่างและเครื่องปรับอากาศ คุณไม่สามารถเดินทางผ่านกำแพงและอาจเดินทางแบบ orthogonally เท่านั้น แผนที่อาจไม่ได้เป็นรูปสี่เหลี่ยมผืนผ้าเสมอไป

การรักษาระยะทางให้สั้นที่สุดจากหน่วย AC คือผลรวมของทุกขั้นตอน

ผ่านหมายถึงการเข้าและออก

คุณสามารถออกเส้นทางในแบบที่คุณชอบ ตัวอย่างรวมถึง:

  • เอาท์พุทแผนที่พร้อมเส้นทางรวม
  • การส่งออกเส้นทางเป็นจุดต่อเนื่องของเข็มทิศ (เช่นNNSESW)

2
@BetaDecay แล้วคำนวณอย่างไร? ระยะทางสูงสุด ณ เวลาใด ๆ ? ผลรวม / เฉลี่ยของระยะทางในทุกขั้นตอนใช่หรือไม่
Ingo Bürk

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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.