샌프란시스코의 택시


14

당신은 샌프란시스코의 택시 운전사입니다. 택시 운전 기사의 일반적인 경우와 마찬가지로 이동 가능한 유효한 방향이 왼쪽, 오른쪽, 위 및 아래 인 그리드를 탐색합니다. 그러나 San Fransisco는 매우 구릉이므로 두 교차점 사이의 거리가 반드시 같을 필요는 없습니다. 보다 구체적으로, 고도의 교차점과 고도 a의 인접 교차점 사이의 거리b 것이다 1 + |a - b|. 목표는지도 왼쪽 상단의 출발지에서 오른쪽 하단의 목적지까지의 가장 짧은 경로를 찾는 것입니다.

입력

가장 편리한 형식의 정수 고도의 2 차원 격자 (2 차원 배열, 너비 및 / 또는 높이가있는 1 차원 배열 등).

산출

이동하는 방향의 시퀀스는 두 개의 인접한 고도의 교점 사이의 거리가 소정의 최단 거리 가능 왼쪽 상단에서 입력의 오른쪽 하단에 도달하도록 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

@Dada 고도는 반드시 10보다 작을 필요는 없으며 (음수 일 수도 있음), 이에 따라 예제를 업데이트했습니다.
0

내가이 포스트가 활동적인 것을 알았을 때 나는 suuuuuuper에 흥분했다 – 나는 누군가가 택시에 답을 올렸다고 생각했다! 아마 언젠가
우주 쓰레기

답변:


2

자바 스크립트 (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)

입력

1 차원 배열 a및 너비w카레 구문의(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.