Jaga Perjalanan Saya Tetap Dingin!

11

Tantangan

Berjalan di sekitar Marks and Spencers, saya perhatikan bahwa mereka memiliki unit pendingin udara yang ditempatkan secara acak di sekitar toko. Ingin tetap tenang, saya bertanya-tanya apa cara termudah untuk berkeliling seluruh toko tanpa terlalu jauh dari unit pendingin udara.

Diberikan peta, Anda harus menemukan cara untuk berkeliling di seluruh peta menjaga jarak dari unit pendingin udara sesingkat mungkin (bahkan jika unit AC di sisi lain dinding).

Peta

Peta dapat diberikan dengan cara apa pun yang Anda suka dan menggunakan simbol-simbol berikut:

+ 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

Contoh peta adalah:

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

atau

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

Berkeliling di seluruh peta berarti melewati setiap ruang kosong dan pendingin udara. Anda tidak dapat melakukan perjalanan melalui dinding dan hanya dapat melakukan perjalanan secara orthogonal. Peta mungkin tidak selalu persegi panjang.

Menjaga jarak sesingkat mungkin dari unit AC adalah jumlah dari semua langkah waktu.

Melewati berarti masuk dan pergi.

Anda dapat menampilkan jalur dengan cara apa pun yang Anda suka. Contohnya termasuk:

  • Mengeluarkan peta dengan jalur yang disertakan
  • Mengeluarkan jalur sebagai rangkaian titik kompas (mis. NNSESW)
Peluruhan Beta
sumber
2
@ BetaDecay Dan bagaimana cara menghitungnya? Jarak maksimum pada suatu titik waktu? Jumlah / rata-rata jarak dari semua langkah waktu?
Ingo Bürk
5
Tidak mungkin untuk memahami apa tujuan dari masalah ini. Jika Anda harus mengunjungi setiap kotak, jarak maksimum adalah konstan.
feersum
1
@feersum Kenapa begitu? Tidak bisakah tata letak peta membuatnya perlu untuk mengunjungi kembali kotak tertentu dan dengan demikian memberikan beberapa kemungkinan untuk lintasan?
InvisiblePanda
6
Apakah ini masalah optimasi? Jika tidak, harus ada beberapa test case dengan output yang benar.
mbomb007
2
Bisakah Anda memberi kami jarak untuk hanya dua cara perjalanan yang mungkin untuk contoh pertama?
mdahmoune

Jawaban:

1

PowerShell untuk Windows, 376 367 byte

Seperti orang malas, saya tidak pergi ke setiap rak, saya pindah dari AC ke AC di toko. Saya percaya saya bepergian ke seluruh toko mengunjungi setiap AC di dalamnya.

$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}

Cobalah online!

Belum dibuka:

$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
}
mazzy
sumber