รถแท็กซี่ในซานฟรานซิสโก


14

คุณเป็นนักขับรถแท็กซี่ในซานฟรานซิสโก ในฐานะที่เป็นเรื่องปกติของคนขับรถแท็กซี่คุณกำลังนำทางกริดที่ทิศทางที่ถูกต้องเท่านั้นที่คุณสามารถเคลื่อนย้ายได้คือด้านซ้ายขวาขึ้นและลง อย่างไรก็ตามซานฟรานซิสโกเป็นเนินเขามากดังนั้นระยะห่างระหว่างสี่แยกที่อยู่ติดกันไม่จำเป็นต้องเหมือนกัน โดยเฉพาะอย่างยิ่งระยะห่างระหว่างจุดตัดที่ระดับความสูงaและสี่แยกที่อยู่ติดกันที่ระดับความสูงจะเป็นb 1 + |a - b|เป้าหมายของคุณคือค้นหาเส้นทางที่สั้นที่สุดจากต้นกำเนิดของคุณที่ด้านบนซ้ายของแผนที่ไปยังปลายทางที่ด้านล่างขวา

อินพุต

ตารางสองมิติของระดับความสูงของจำนวนเต็มในรูปแบบใดก็ได้ที่สะดวกที่สุด (อาร์เรย์สองมิติ, อาร์เรย์หนึ่งมิติที่มีความกว้างและ / หรือความสูง ฯลฯ )

เอาท์พุต

ลำดับของเส้นทางที่จะเดินทางมาถึงที่มุมล่างขวาของการป้อนข้อมูลจากด้านบนที่เหลืออยู่ในระยะทางที่สั้นที่สุดที่กำหนดระยะห่างระหว่างสองทางแยกที่อยู่ติดกันมีระดับaและจะได้รับจากสูตรb 1 + |a - b|หากมีหลายทางออกโซลูชันทั้งหมด

แม้ว่าฉันจะใช้U, D, LและRสำหรับขึ้นลงซ้ายและขวาในตัวอย่างด้านล่างโปรแกรมของคุณอาจจะใช้ใด ๆ สี่สายที่แตกต่างกันเพื่อเป็นตัวแทนของทิศทางตราบเท่าที่มันสอดคล้องกับพวกเขาในและทั่วทั้งปัจจัยการผลิตทั้งหมด

ตัวอย่าง

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

นี่คือดังนั้นคำตอบด้วยจำนวนไบต์ที่สั้นที่สุดจะชนะ


1
ระดับความสูงน้อยกว่า 10 หรือไม่? (พวกเขาอยู่ในตัวอย่าง แต่พวกเขาจะเป็นเสมอ?)
Dada

@ ลดระดับความสูงไม่จำเป็นต้องน้อยกว่า 10 (อาจเป็นลบได้) ฉันได้อัปเดตตัวอย่างตามนั้น
0

เมื่อฉันเห็นว่าโพสต์นี้เปิดใช้งานฉันตื่นเต้น suuuuuuper - ฉันคิดว่ามีคนโพสต์คำตอบในรถแท็กซี่! อาจวันหนึ่ง
ขยะอวกาศ

คำตอบ:


2

JavaScript (ES6), 228 212 200 194 ไบต์

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)

อินพุต

อาร์เรย์หนึ่งมิติ aและความกว้างwในรูปแบบการ Curating(a)(w)

เอาท์พุต

รายการโซลูชันที่คั่นด้วยช่องว่างเช่น "DRDRRDR DRDRDRR"

จัดรูปแบบและแสดงความคิดเห็น

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

กรณีทดสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.