드리프트 주행

NYPC 2022 · Round 1

드리프트 주행 기술에 매력을 느낀 다오는 주행 중 드리프트 기술을 가능한 한 많이 적용하려고 한다. 왜냐하면, 방향을 자주 바꿀수록 자동차가 지나간 흔적, 즉 스키드 마크가 아름답게 형성된다고 생각하기 때문이다.

H×WH \times W 크기의 격자판의 맵이 있다. 다오는 이 맵에서 주행 연습을 하고 있다.

이 맵에서 위에서 ii 번째 줄, 왼쪽에서 jj 번째 칸에 있는 격자를 (i,j)(i, j)라고 하자.

다오는 (A,B)(A, B)에서 주행을 시작하고, (C,D)(C, D)에서 주행을 마치고자 한다. 주행 시 매 순간 상하좌우로 인접한 격자 중 어느 곳으로 이동할지 결정해야 한다. 어떠한 결정을 해도 자동차 움직인 경로를 따라 스키드 마크가 남게 된다. 다오는 이를 통해 멋진 그림을 만들고자 한다.

다오가 주행 시 지켜야 할 규칙은 다음과 같다:

  1. 자동차의 이동 경로를 나타내는 스키드 마크는 서로 겹치면 안 된다. 즉, 이전에 방문한 칸에 다시 방문할 수 없다.
  2. 장애물이 있는 칸은 지나갈 수 없다.
  3. 맵 밖으로 나갈 수 없다.

다오는 위의 주행 규칙을 따르면서 드리프트를 가능한 한 많이 하여 아름다운 그림을 만들려고 한다. 드리프트란, 좌우 9090도로 방향 전환하는 것을 의미한다.

다오가 상하좌우로 인접한 격자로 이동하는 것을 각각 하나의 문자 W, S, A 혹은 D로 나타내자. 일반적인 쿼티 키보드에서 WASD의 배치를 생각하면 좋다. 주행 경로 문자열이란, 각 이동을 문자로 표현하여 순서대로 나열한 것이다.

아래 그림은 크기가 3×63 \times 6인 격자에서 다오가 (3,1)(3, 1)에서 주행을 시작하여 (3,5)(3, 5)에서 주행을 마칠 때, 다오가 이동한 경로를 예로 보여준다.

이때, 다오의 주행 경로 문자열은 DDWDWDDSSA이다. 이 경우, 다오는 총 66 번의 드리프트를 했다.

맵에 대한 정보와 다오의 시작, 종료 위치가 주어질 때, 드리프트를 많이 하는 주행 경로 문자열을 출력하는 프로그램을 작성하시오.

입력 형식

첫 줄에 격자의 크기를 나타내는 두 정수 HHWW가 공백으로 구분되어 주어진다. (3H35;3 \le H \le 35; 3W603 \le W \le 60)

두 번째 줄에 다오의 시작 위치와 종료 위치를 나타내는 네 정수 AA, BB, CC, DD가 공백으로 구분되어 주어진다. (1A,CH;1 \le A, C \le H; 1B,DW;1 \le B, D \le W; (A,B)(C,D)(A, B) \ne (C, D))

이어지는 HH 개의 줄에 맵의 정보를 나타내는 WW 개의 문자가 주어진다. 주어지는 문자는 . 또는 #이며, 각각 차례대로 장애물이 없는 칸과 장애물이 있는 칸을 의미한다.

다오의 시작 위치와 종료 위치에 장애물이 있지 않으며, 시작 위치에서 종료 위치로 가는 주행 경로가 항상 존재하도록 입력이 주어진다.

출력 형식

첫 줄에 다오가 주행 중 드리프트한 횟수를 출력한다.

두 번째 줄에 다오의 주행 경로 문자열을 출력한다.

예제

입력

3 6 3 1 3 5 ...... ##..#. ...#..

출력

6 DDWDWDDSSA

채점 방식

이 문제는 풀이 소스 코드를 제출하지 않고, 각 테스트 케이스의 입력 데이터를 다운받아 알맞은 출력 파일을 만들어 출력 파일만을 제출하는 문제다.

이 문제의 총점은 모든 미션의 점수의 합으로 계산된다. 각 미션의 점수를 계산하는 방법은 다음과 같다.

단, 참가자의 출력이 올바르지 않은 경우 (출력 형식을 맞추지 않았거나, 주행 규칙을 모두 지키지 않는 등) P=0P = 0이다.

편의상, Δ=max{α30,5}\Delta = \max\left\{ \left\lceil \frac{\alpha}{30} \right\rceil, 5 \right\} 라고 하자. 이때, x\lceil x \rceilxx 이상의 가장 작은 정수를 의미한다. 모든 미션에서 Δ<α\Delta < \alpha 임에 유의하라.

  1. LαL \ge \alpha 인 경우: P=SP = S
  2. αΔL<α\alpha - \Delta \le L < \alpha 인 경우: P=(0.5+(L+Δα)×(L+Δα)2×Δ×Δ)×S\displaystyle P = \left( 0.5 + \frac{( L + \Delta - \alpha ) \times ( L + \Delta - \alpha )}{2 \times \Delta \times \Delta} \right) \times S
  3. L<αΔL < \alpha - \Delta 인 경우: P=0.5×LαΔ×S\displaystyle P = 0.5 \times \frac{L}{\alpha - \Delta} \times S

이때, PP는 최종적으로 0.10.1 단위로 버림된다.

각 미션의 정보는 다음과 같다.

#HHWWSSα\alpha
11445510101212
22555510101616
3355111110101212
44668810103131
55888810105555
66101025251010221221
77121230301010314314
88151540401010520520
9925255959101010821\,082
101035356060101018481\,848

각 미션마다 만점을 받을 수 있는 출력이 존재함이 보장된다.

문제 해결을 도와주는 시뮬레이터가 아래 미션에 대해 제공된다. 제공되는 시뮬레이터는 최신 버전의 크롬 브라우저에서 여는 것을 권장한다.

미션 1
미션 2
미션 3
미션 4
미션 5
미션 6
미션 7
미션 8
미션 9
미션 10

해설