아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

상자를 미는 로봇

시간 제한4초메모리 제한512 MB

요약
로봇이 빈 칸을 걸어 다니며 상자를 한 칸씩 밀 수 있을 때, 상자가 시작 칸에서 도달할 수 있는 격자 칸의 수를 센다.
난이도

보통10점 중 6점

유형
BFS, 그래프
정답자
아직 제출이 없습니다

문제

공장에서 무거운 상자를 로봇으로 옮긴다. 상자를 어떤 방향으로 옮기려면 로봇이 먼저 상자 뒤쪽 칸으로 이동한 다음, 그 방향으로 상자를 밀어야 한다.

공장 바닥은 m×nm \times n 격자다. 장애물이 놓인 칸은 막힌 칸이다. 로봇과 상자는 각각 한 칸을 차지한다. 오른쪽 그림에서 막힌 칸은 회색이고, r과 s는 각각 로봇과 상자의 위치다.

장애물이 없고 상자도 놓여 있지 않은 칸을 빈 칸이라고 한다. 로봇은 한 번의 이동으로 현재 칸의 위, 아래, 왼쪽, 오른쪽 중 빈 칸 하나로 옮겨 간다. 인접한 칸에 상자가 있으면 로봇은 같은 방향으로 상자를 한 칸 밀 수 있다. 단, 상자가 들어갈 칸이 빈 칸이어야 한다. 로봇과 상자는 격자 밖으로 나갈 수 없다.

상자는 시작 칸 s에, 로봇은 칸 r에 있다. 로봇이 상자를 s에서 t까지 미는 이동 순서가 존재하면 칸 t는 s에서 도달 가능하다. 위 그림에서 왼쪽의 t는 s에서 도달 가능하지만, t'는 도달할 수 없다. 격자와 두 시작 위치가 주어질 때, s에서 도달 가능한 칸이 몇 개인지 세는 프로그램을 작성한다. 로봇이 상자에 끝내 닿지 못하더라도 s 자신은 항상 개수에 포함한다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 격자의 행 개수와 열 개수를 뜻하는 두 정수 m과 n이 주어진다 (1≤m,n≤10001 \le m, n \le 1000). 다음 m개의 줄에는 길이가 n인 문자열이 주어지고, i번째 줄의 j번째 문자가 칸 (i, j)를 나타낸다. 장애물은 o, 로봇의 위치는 r, 상자의 시작 위치는 s, 나머지 칸은 -다. 격자마다 r와 s는 정확히 하나씩 나온다. 입력의 마지막 줄은 0 0이며, 이 줄은 테스트 케이스가 아니다. 모든 테스트 케이스의 m×nm \times n 합은 10610^6 이하다.

출력

각 테스트 케이스마다 상자가 시작 위치 s에서 도달할 수 있는 칸의 개수를 한 줄에 출력한다.

예제2

  1. 예제 1

    입력
    7 7
    o------
    -o-----
    -------
    -oooo--
    -----o-
    ---s---
    r----o-
    3 4
    ---o
    -os-
    ---r
    0 0
    
    예상 출력
    21
    6
    
  2. 예제 2

    입력
    1 2
    rs
    1 3
    rs-
    1 3
    r-s
    3 3
    ---
    -s-
    r--
    2 1
    r
    s
    0 0
    
    예상 출력
    1
    2
    1
    9
    1