Taxi in San Francisco

14

Sie sind Taxifahrer in San Francisco. Wie es für Taxifahrer typisch ist, navigieren Sie in einem Raster, in dem Sie sich nur nach links, rechts, oben und unten bewegen können. San Francisco ist jedoch sehr hügelig, sodass der Abstand zwischen zwei benachbarten Kreuzungen nicht unbedingt gleich ist. Genauer gesagt, der Abstand zwischen einem Schnittpunkt in der Höhe aund eine benachbarte Kreuzung auf Höhe bwäre 1 + |a - b|. Ihr Ziel ist es, die kürzesten Wege von Ihrem Ursprung oben links auf der Karte zu Ihrem Ziel unten rechts zu finden.

Eingang

Ein zweidimensionales Gitter mit ganzzahligen Höhen, in welchem ​​Format auch immer dies am zweckmäßigsten ist (zweidimensionales Array, eindimensionales Array mit Breite und / oder Höhe usw.).

Ausgabe

Eine Abfolge von Fahrtrichtungen, um in der unteren rechten Ecke der Eingabe von oben links in der kürzestmöglichen Entfernung anzukommen, wenn der Abstand zwischen zwei benachbarten Schnittpunkten von Höhen aund Tiefen gegeben istb ist durch die Formel gegeben 1 + |a - b|. Bei mehreren Lösungen werden alle Lösungen ausgegeben.

Obwohl ich U, D, LundR für oben, unten, links und rechts in den folgenden Beispielen Ihr Programm kann alle vier verschiedene Zeichenketten verwenden , um die Richtungen darstellen, solange sie mit ihnen in und über allen Eingängen konsistent ist.

Beispiele

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

Dies ist daher gewinnt die Antwort mit der kürzesten Bytezahl.

0 '
quelle
1
Sind die Höhen immer kleiner als 10? (sie sind auf den Beispielen, aber werden sie immer sein?)
Dada
@ Da die Höhen nicht unbedingt kleiner als 10 sind (sie können auch negativ sein), habe ich die Beispiele entsprechend aktualisiert.
0 '
Als ich sah, dass dieser Beitrag aktiv war, war ich sehr aufgeregt - ich dachte, jemand hätte eine Antwort im Taxi gepostet! vielleicht eines Tages
Weltraummüll

Antworten:

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)

Eingang

Eindimensionales Array aund Breite win der aktuellen Syntax(a)(w)

Ausgabe

Eine durch Leerzeichen getrennte Liste von Lösungen wie "DRDRRDR DRDRDRR"

Formatiert und kommentiert

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

Testfälle

Arnauld
quelle