배틀쉽

면접 대비

시간 제한2초메모리 제한1024 MB

요약
격자 한 칸에만 말이 있을 때, 미끄러지는 규칙으로 모든 빈 칸에 말을 하나씩 채울 수 있는지 판정하고 순서를 출력한다.
난이도

보통10점 중 6점

유형
그래프, 시뮬레이션, 구현, 그리디
정답자
아직 제출이 없습니다

문제

보드게임 배틀쉽은 N×MN\times M 격자판 위에서 진행된다. NMNM개의 칸 중 KK개의 칸은 벽이다. 벽이 아닌 모든 칸들은 상하좌우로 서로 연결되어 있다. (0≤K\<NM)(0\le K\<NM)

벽이 아닌 어떤 칸에 말이 NM−KNM-K개 올려져 있을 때, 하늘이는 다음 행위를 반복하여 벽이 아닌 모든 칸에 말을 정확히 한 개씩 배치하려고 한다.

  1. 말이 22개 이상 놓여져 있는 칸을 선택해 말을 11개 이상 가져간다. 단, 말을 적어도 하나 남겨두어야 한다.
  2. 왼쪽, 오른쪽, 위쪽, 아래쪽 중 한 방향을 선택한 뒤 벽이 등장하거나, 말이 놓여있거나, 격자판을 벗어나기 직전까지 이동한다. 이 때 최소 한 칸 이동하여야 한다.
  3. 도착한 칸에 가져갔던 말을 전부 놓는다.

하늘이가 목표를 달성할 수 있는지 판별하고 가능하다면 방법을 하나 출력해보자. 만약 방법이 여러 가지라면 아무거나 출력해도 된다.

입력

첫째 줄에 NN, MM이 공백을 사이에 두고 주어진다. (1≤N,M≤500)(1 \leq N,M \leq 500)

둘째 줄부터 NN개의 줄에 걸쳐 격자판을 나타내는 길이 MM의 문자열이 주어진다. 문자열은 #과 .로만 이루어져 있으며 #은 벽을, .은 벽이 아닌 칸을 의미한다. 모든 .은 상하좌우로 서로 연결되어 있다.

N+2N+2번째 줄에 말이 놓여있는 칸을 나타내는 정수 RR, CC가 공백을 사이에 두고 주어진다. 이는 위에서 RR번째 행, 왼쪽에서 CC번째 열임을 의미한다. 해당 칸은 벽이 아니다. (1≤R≤N;(1 \leq R \leq N; 1≤C≤M)1 \leq C \leq M)

출력

첫째 줄에 하늘이가 목표를 달성할 수 있다면 YES를, 그렇지 않다면 NO를 출력한다.

달성할 수 있다면 가능하다면 둘째 줄에 행위를 반복하는 횟수 VV를 출력하고, 셋째 줄 부터 VV개의 줄에 걸쳐 다음과 같은 형식으로 방법을 출력한다.

  • r,c,n,dr\\, c\\, n\\, d: (r,c)(r,c) 칸에서 nn개의 말을 가져가 dd 방향으로 최대한 이동한 후 말을 놓는다.

(r,c)(r,c) 칸은 위에서 rr번째 행, 왼쪽에서 cc번째 열에 해당하는 칸으로, 말이 nn개보다 많이 놓여있고 벽이 아니어야 한다. dd는 왼쪽, 오른쪽, 위쪽, 아래쪽 각각 L, R, U, D의 값을 가지며, 한 칸 이상 이동이 가능한 방향이어야 한다.

위의 조건을 지키지 않으면 틀렸습니다를 받음에 유의하시오.

예제2

  1. 예제 1

    입력
    3 3
    ...
    .#.
    ...
    1 1
    
    예상 출력
    YES
    7
    1 1 7 R
    1 3 5 D
    3 3 1 U
    3 3 3 L
    3 1 1 U
    3 1 1 R
    1 3 1 L
    
  2. 예제 2

    입력
    3 3
    ...
    #.#
    ...
    1 2
    
    예상 출력
    YES
    6
    1 2 4 D
    3 2 1 U
    3 2 1 L
    3 2 1 R
    1 2 1 L
    1 2 1 R