Taxi ở San Francisco


14

Bạn là một lái xe taxi ở San Francisco. Là điển hình của trình điều khiển xe taxi, bạn đang điều hướng một lưới trong đó các hướng hợp lệ duy nhất bạn có thể di chuyển là trái, phải, lên và xuống. Tuy nhiên, San Fransisco rất đồi núi nên khoảng cách giữa hai giao lộ liền kề không nhất thiết phải giống nhau. Cụ thể hơn, khoảng cách giữa một giao lộ ở độ cao avà một giao lộ liền kề ở độ cao bsẽ là 1 + |a - b|. Mục tiêu của bạn là tìm tất cả các con đường ngắn nhất từ ​​nguồn gốc của bạn ở phía trên bên trái của bản đồ đến đích ở phía dưới bên phải.

Đầu vào

Lưới hai chiều có độ cao nguyên ở định dạng nào thuận tiện nhất (mảng hai chiều, mảng một chiều có chiều rộng và / hoặc chiều cao, v.v.).

Đầu ra

Một chuỗi các hướng để đi đến góc dưới bên phải của đầu vào từ trên cùng bên trái trong khoảng cách ngắn nhất có thể được đưa ra khoảng cách giữa hai giao điểm cao độ liền kề abđược đưa ra theo công thức 1 + |a - b|. Nếu có nhiều giải pháp đầu ra tất cả các giải pháp.

Mặc dù tôi sử dụng U, D, L, và Rcho lên, xuống, trái, và ngay trong các ví dụ dưới đây chương trình của bạn có thể sử dụng bất kỳ bốn dây độc đáo thể hiện các hướng dẫn miễn là nó phù hợp với chúng trong và trên tất cả các đầu vào.

Ví dụ

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

Đây là vì vậy câu trả lời có số byte ngắn nhất sẽ thắng.


1
Có phải độ cao luôn nhỏ hơn 10? (họ đang ở trên các ví dụ, nhưng họ sẽ luôn như vậy chứ?)
Dada

@Dada độ cao không nhất thiết phải nhỏ hơn 10 (chúng cũng có thể âm), tôi đã cập nhật các ví dụ tương ứng.
0 '

Khi tôi thấy bài đăng này hoạt động, tôi rất phấn khích - tôi nghĩ ai đó đã đăng câu trả lời trên taxi! có thể một ngày
rác vũ trụ

Câu trả lời:


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)

Đầu vào

Mảng một achiều và chiều rộng wtrong cú pháp currying(a)(w)

Đầu ra

Một danh sách các giải pháp được phân tách bằng dấu cách "DRDRRDR DRDRDRR"

Định dạng và nhận xét

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
)                                      //

Các trường hợp thử nghiệm

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.