Giữ cho chuyến đi của tôi mát mẻ!


11

Thử thách

Dạo quanh Marks và Spencers, tôi nhận thấy rằng họ có các đơn vị điều hòa không khí được đặt ngẫu nhiên xung quanh cửa hàng. Muốn giữ mát, tôi tự hỏi đâu là cách dễ nhất để di chuyển xung quanh toàn bộ cửa hàng mà không phải rời xa một đơn vị điều hòa không khí quá lâu.

Đưa ra một bản đồ, bạn phải tìm cách di chuyển xung quanh toàn bản đồ để giữ khoảng cách với một đơn vị điều hòa không khí càng ngắn càng tốt (ngay cả khi đơn vị AC ở phía bên kia của bức tường).

Bản đồ

Bản đồ có thể được cung cấp theo bất kỳ cách nào bạn thích và sử dụng các ký hiệu sau:

+ 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

Một bản đồ ví dụ sẽ là:

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

hoặc là

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

Du lịch vòng quanh toàn bản đồ có nghĩa là đi qua mọi không gian trống và điều hòa. Bạn không thể đi qua một bức tường và chỉ có thể đi du lịch trực giao. Một bản đồ có thể không phải luôn luôn là hình chữ nhật.

Giữ khoảng cách càng ngắn càng tốt từ một đơn vị AC là tổng của tất cả các bước thời gian.

Đi qua có nghĩa là vào và ra.

Bạn có thể xuất đường dẫn theo bất kỳ cách nào bạn muốn. Những ví dụ bao gồm:

  • Xuất bản đồ với đường dẫn đi kèm
  • Xuất ra đường dẫn như một chuỗi các điểm la bàn (ví dụ NNSESW)

2
@BetaDecay Và nó được tính như thế nào? Khoảng cách tối đa tại thời điểm nào? Tổng / trung bình của khoảng cách qua tất cả các bước thời gian?
Ingo Bürk

5
Không thể hiểu mục tiêu của vấn đề này là gì. Nếu bạn phải ghé thăm mỗi ô vuông, khoảng cách tối đa là một hằng số.
frageum

1
@feersum Tại sao vậy? Không thể bố trí bản đồ khiến bạn cần phải xem lại một số hình vuông nhất định và do đó cung cấp nhiều khả năng cho đường dẫn?
InvisiblePanda

6
Đây có phải là một vấn đề tối ưu hóa? Nếu không, cần có một số trường hợp thử nghiệm với đầu ra chính xác.
mbomb007

2
Bạn có thể cho chúng tôi khoảng cách cho hai cách di chuyển duy nhất có thể cho ví dụ đầu tiên không?
mdahmoune

Câu trả lời:


1

PowerShell cho Windows, 376 367 byte

Giống như một người đàn ông lười biếng, tôi không đi đến mọi kệ hàng, tôi chuyển từ điều hòa không khí sang điều hòa không khí trong cửa hàng. Tôi tin rằng tôi đã đi khắp các cửa hàng đến thăm mọi máy điều hòa không khí trong đó.

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

Hãy thử trực tuyến!

Chưa được kiểm soát:

$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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.