공주를 도와줘!
시간 제한2초메모리 제한512 MB
격자에 있는 공주가 동시에 움직이는 여러 병사를 피해 유일한 탈출구에 도달할 수 있는지 판정한다.
문제
어느 왕국의 백성들이 공주의 폭정에 맞서 혁명을 일으켰다. 혁명군은 공주가 사는 왕궁에 들이닥쳤고, 병사들은 공주를 붙잡으려고 왕궁 안을 뒤지고 있다. 공주가 왕궁에서 탈출할 수 있는지 판정하는 프로그램을 작성하시오.
왕궁의 바닥은 격자로 나뉜 직사각형이다. 격자의 칸은 두 종류다. 공주와 병사가 들어갈 수 있는 칸을 빈 칸, 아무도 들어갈 수 없는 칸을 벽이라 부른다. 처음에 공주와 병사들은 서로 다른 빈 칸에 있다. 격자에는 탈출구가 정확히 하나 있고, 공주가 탈출구에 도착하면 왕궁을 탈출한다. 병사는 0명 이상이다.
매 단위 시간마다 공주와 모든 병사는 동시에 행동한다. 즉, 서로 상대가 다음에 어떻게 움직일지 모르는 채로 자신의 행동을 정해야 한다. 한 단위 시간에 공주와 병사는 상하좌우로 인접한 빈 칸으로 이동하거나 현재 칸에 머무를 수 있고, 왕궁 바닥 밖으로 나갈 수는 없다. 이동이 끝난 뒤 공주와 병사 한 명 이상이 같은 칸에 있으면 공주는 붙잡힌다. 병사를 모두 없앤다면 공주가 빈 칸만 거쳐 탈출구에 도달할 수 있음이 보장된다.
병사들이 어떻게 움직이더라도 붙잡히지 않는 경로가 공주에게 존재하면 공주는 병사들을 따돌리고 탈출할 수 있다. 공주와 병사가 탈출구에 동시에 도착하면 공주는 붙잡힌다는 점에 주의하라. 공주는 왕궁을 탈출할 수 있는가?
입력
입력은 다음 형식이다.
H W
map1
.
.
.
mapH
첫째 줄에 격자의 높이 와 너비 가 공백으로 구분되어 주어진다. ()
이어지는 개 줄 중 번째 줄에는 왕궁 바닥의 상태를 나타내는 길이 의 문자열 map가 주어진다. map의 번째 문자는 번째 행 번째 열 칸의 상태다.
'@', '$', '%', '.', '#'은 각각 공주, 병사, 탈출구, 빈 칸, 벽을 뜻한다. 격자에 '@'와 '%'는 정확히 하나씩 있고, '$'는 0개 이상 있음이 보장된다.
출력
공주가 왕궁을 탈출할 수 있으면 "Yes"를, 그렇지 않으면 "No"를 한 줄에 출력한다.