https://www.acmicpc.net/problem/14503
from collections import deque
n, m = map(int, input().split())
r, c, d = map(int, input().split())
graph = [list(map(int,input().split())) for _ in range(n)]
visited = [[0]*m for _ in range(n)]
visited[r][c] = 1
# 바라보는 방향 왼쪽으로 도는 함수 (현재 방향 기준)
def turnLeft(direction):
return {0:3, 1:0, 2:1, 3:2}[direction]
# 바라보는 위치 기준 왼쪽 좌표
goLeft = {0: [0,-1], 1: [-1,0], 2:[0,1], 3:[1,0]}
# 바라보는 위치 기준 뒷쪽 좌표
goBack = {0: [1,0], 1: [0,-1], 2:[-1,0], 3:[0,1]}
q= deque()
q.append([r,c])
count = 0
ans = 1
while q:
x, y = q.popleft()
# 4번 연속 회전이라면
if count >= 4:
# 뒷쪽 좌표 가져오기
nx, ny = goBack[d][0]+x, goBack[d][1]+y
# 뒤로 갈때는 청소여부 상관없음, 벽인지만 검사
if 0<=nx<n and 0<=ny<m and not graph[nx][ny]:
q.append([nx,ny]) # 위치 업데이트
count = 0 # 카운트 초기화
continue
else:
# 카운트가 4번이고, 뒷쪽이 벽이라면 종료
break
# 내 왼쪽 좌표 가져오기
nx, ny = goLeft[d][0]+x, goLeft[d][1]+y
# 바라보는 위치 업데이트
d = turnLeft(d)
# 범위내에 있고 왼쪽좌표(nx,ny)가 빈칸이면서 청소하지 않았다면
if 0<=nx<n and 0<=ny<m and not graph[nx][ny] and not visited[nx][ny]:
q.append([nx,ny]) #위치 이동
visited[nx][ny] = 1 #청소하기
ans += 1 #청소구역 + 1
count = 0 # 카운트 초기화
else:
# 돌기만하므로 제자리로 위치 업데이트
q.append([x,y])
count += 1 #제자리 회전하므로 카운트+1
# 답 출력
print(ans)