로봇이 빈 칸을 걸어 다니며 상자를 한 칸씩 밀 수 있을 때, 상자가 시작 칸에서 도달할 수 있는 격자 칸의 수를 센다.
보통6BFS그래프아직 제출이 없습니다시간 제한4초메모리 제한512 MB
공장에서 무거운 상자를 로봇으로 옮긴다. 상자를 어떤 방향으로 옮기려면 로봇이 먼저 상자 뒤쪽 칸으로 이동한 다음, 그 방향으로 상자를 밀어야 한다.
공장 바닥은 m×n 격자다. 장애물이 놓인 칸은 막힌 칸이다. 로봇과 상자는 각각 한 칸을 차지한다. 오른쪽 그림에서 막힌 칸은 회색이고, r과 s는 각각 로봇과 상자의 위치다.
장애물이 없고 상자도 놓여 있지 않은 칸을 빈 칸이라고 한다. 로봇은 한 번의 이동으로 현재 칸의 위, 아래, 왼쪽, 오른쪽 중 빈 칸 하나로 옮겨 간다. 인접한 칸에 상자가 있으면 로봇은 같은 방향으로 상자를 한 칸 밀 수 있다. 단, 상자가 들어갈 칸이 빈 칸이어야 한다. 로봇과 상자는 격자 밖으로 나갈 수 없다.
상자는 시작 칸 s에, 로봇은 칸 r에 있다. 로봇이 상자를 s에서 t까지 미는 이동 순서가 존재하면 칸 t는 s에서 도달 가능하다. 위 그림에서 왼쪽의 t는 s에서 도달 가능하지만, t'는 도달할 수 없다. 격자와 두 시작 위치가 주어질 때, s에서 도달 가능한 칸이 몇 개인지 세는 프로그램을 작성한다. 로봇이 상자에 끝내 닿지 못하더라도 s 자신은 항상 개수에 포함한다.
입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 격자의 행 개수와 열 개수를 뜻하는 두 정수 m과 n이 주어진다 (1≤m,n≤1000). 다음 m개의 줄에는 길이가 n인 문자열이 주어지고, i번째 줄의 j번째 문자가 칸 (i, j)를 나타낸다. 장애물은 o, 로봇의 위치는 r, 상자의 시작 위치는 s, 나머지 칸은 -다. 격자마다 r와 s는 정확히 하나씩 나온다. 입력의 마지막 줄은 0 0이며, 이 줄은 테스트 케이스가 아니다. 모든 테스트 케이스의 m×n 합은 106 이하다.
각 테스트 케이스마다 상자가 시작 위치 s에서 도달할 수 있는 칸의 개수를 한 줄에 출력한다.