Taksi di San Francisco

14

Anda adalah sopir taksi di San Francisco. Seperti tipikal driver taksi, Anda menavigasi grid di mana satu-satunya arah yang valid yang dapat Anda pindahkan adalah kiri, kanan, atas, dan bawah. Namun, San Fransisco sangat berbukit sehingga jarak antara dua persimpangan yang berdekatan belum tentu sama. Lebih khusus lagi, jarak antara persimpangan di ketinggian adan persimpangan yang berdekatan di ketinggian bakan 1 + |a - b|. Tujuan Anda adalah untuk menemukan semua jalur terpendek dari asal Anda di kiri atas peta ke tujuan Anda di kanan bawah.

Memasukkan

Grid dua dimensi dari ketinggian integer dalam format apa pun yang paling nyaman (array dua dimensi, array satu dimensi dengan lebar dan / atau tinggi, dll.).

Keluaran

Urutan arah untuk melakukan perjalanan untuk tiba di sudut kanan bawah input dari kiri atas dalam jarak sesingkat mungkin yang diberikan jarak antara dua persimpangan ketinggian yang berdekatan adan bdiberikan oleh rumus 1 + |a - b|. Jika ada beberapa solusi, keluarkan semua solusi.

Meskipun saya menggunakan U, D, L, dan Runtuk atas, bawah, kiri, dan kanan pada contoh di bawah program anda dapat menggunakan empat senar yang berbeda untuk mewakili arah asalkan konsisten dengan mereka dalam dan di semua masukan.

Contohnya

Input:
0 3 0 0 0
0 2 0 2 0
0 0 0 3 0
Output:
D D R R U U R R D D

Input:
3
Output:
<empty>

Input:
11 11 11
11 11 11
11 11 11
Output:
R R D D
R D R D
R D D R
D R R D
D R D R
D D R R

Input:
7 8 1 -1 0
4 4 6 -1 7
3 4 4  2 8
2 5 2 -1 2
Output:
D R D R R D R
D R D R D R R

Ini adalah sehingga jawabannya dengan hitungan byte terpendek akan menang.

0 '
sumber
1
Apakah ketinggian selalu kurang dari 10? (mereka ada di contoh, tetapi akan selalu seperti itu?)
Dada
@Dada ketinggian tidak selalu kurang dari 10 (mereka juga bisa negatif), saya telah memperbarui contoh yang sesuai.
0
ketika saya melihat bahwa posting ini aktif saya sangat senang - saya pikir seseorang telah mengirim jawaban di taksi! mungkin suatu hari
sampah luar angkasa

Jawaban:

2

JavaScript (ES6), 228 212 200 194 byte

a=>w=>(B=1/0,(F=(r,p,s,b=a[p])=>p-a.length+1?1/b&&([...a[p]='RDUL'].map((c,d)=>d|p%w<w-1&&d-3|p%w&&F(r+c,P=p+[1,w,-w,-1][d],s+1+Math.abs(b-a[P]))),a[p]=b):R=s>B?R:s<B?(B=s,r):R+' '+r)('',0,0),R)

Memasukkan

Array satu dimensi adan lebar wdalam sintaks currying(a)(w)

Keluaran

Daftar solusi yang dipisahkan oleh ruang seperti "DRDRRDR DRDRDRR"

Diformat dan dikomentari

a => w => (                            // given an array 'a' and a width 'w'
  B = 1 / 0,                           // B = best score so far, initialized as +Infinity
  (                                    //
    F = (                              // F = recursive function with:
      r,                               //   - r = current path (string)
      p,                               //   - p = current position in grid
      s,                               //   - s = current score
      b = a[p]                         //   - b = backup of current cell
    ) =>                               //
    p - a.length + 1 ?                 // if we haven't reached our destination:
      1 / b && (                       //   if the current cell is valid:
        [...a[p] = 'RDUL']             //     invalidate the current cell
        .map((c, d) =>                 //     for each possible direction:
          d | p % w < w - 1 &&         //       check right boundary
          d - 3 | p % w &&             //       check left boundary
          F(                           //       do a recursive call with:
            r + c,                     //         - new direction appended to the path
            P = p + [1, w, -w, -1][d], //         - updated position
            s + 1 + Math.abs(b - a[P]) //         - updated score
          )                            //
        ),                             //
        a[p] = b                       //     restore current cell value
      )                                //
    :                                  // else:
      R = s > B ?                      //   if the current score is worse than B:
        R                              //     keep the previous solution
      : s < B ?                        //   if the current score is better than B:
        (B = s, r)                     //     update best score / store path as new solution
      : R + ' ' + r                    //   if it's just as good: append path to solution
  )('', 0, 0),                         // initial call to F with r = '', p = 0, s = 0
  R                                    // return solution
)                                      //

Uji kasus

Arnauld
sumber