Seyahatimi Serin Tut!


11

Meydan okuma

Marks ve Spencers'ın etrafında dolaşırken, dükkanın etrafına rastgele yerleştirilmiş klima üniteleri olduğunu fark ettim. Serin tutmak istedim, çok uzun süre bir klima ünitesinden uzak kalmadan tüm dükkanda dolaşmanın en kolay yolunun ne olduğunu merak ettim.

Bir harita verildiğinde, bir klima ünitesinden mesafeyi olabildiğince kısa tutarak (AC ünitesi bir duvarın diğer tarafında olsa bile) tüm haritayı dolaşmanın bir yolunu bulmalısınız.

harita

Harita istediğiniz şekilde sağlanabilir ve aşağıdaki simgeleri kullanır:

+ 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

Örnek bir harita şöyle olabilir:

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

veya

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

Tüm haritayı dolaşmak, her boş alan ve klimayı geçmek anlamına gelir. Bir duvarın içinden geçemezsiniz ve sadece dikey olarak seyahat edebilirsiniz. Bir harita her zaman dikdörtgen olmayabilir.

Bir AC ünitesinden mesafeyi mümkün olduğunca kısa tutmak, tüm zaman adımlarının toplamıdır.

Geçmek, girmek ve ayrılmak demektir.

Yolu istediğiniz gibi çıkarabilirsiniz. Örnekler:

  • Haritayı yola dahil olarak çıktılama
  • Yolu pusula noktalarının art arda çıktısı (örn. NNSESW)

2
@BetaDecay Ve bu nasıl hesaplanıyor? Herhangi bir zamanda maksimum mesafe? Tüm zaman adımlarındaki mesafenin toplamı / ortalaması?
Ingo Bürk

5
Bu sorunun amacının ne olduğunu anlamak imkansız. Her kareyi ziyaret etmeniz gerekiyorsa, maksimum mesafe sabittir.
feersum

1
@feersum Neden böyle? Harita düzeni belirli kareleri tekrar gözden geçirmeyi ve böylece yol için birden fazla olasılık vermeyi gerekli kılamadı mı?
InvisiblePanda

6
Bu bir optimizasyon sorunu mu? Değilse, doğru çıkışlara sahip bazı test durumları olmalıdır.
mbomb007

2
Bize ilk örnek için sadece iki olası seyahat yolu için mesafe verebilir misiniz?
mdahmoune

Yanıtlar:


1

PowerShell Windows için, 376 367 bayt

Tembel bir adam gibi, her rafa gitmiyorum, bir mağazadaki klimadan klimaya geçiyorum. Her klima ziyaret mağaza tüm seyahat inanıyorum.

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

Çevrimiçi deneyin!

unrolled:

$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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.