이번 문제는 BFS를 통해 해결하였다. 기존의 BFS와 달리 상하좌우로 한칸씩 탐색하지 않고, 상하로는 최대한으로 탐색하고, 그 이후에 좌우를 한칸씩 탐색하는 방법으로 해야 방문처리를 2차원 리스트로 수행하면서 모든 방문 위치를 저장할 수 있었다.
from collections import deque
n, m = map(int, input().split())
l, r = map(int, input().split())
grid = [list(str(input())) for _ in range(n)]
sy, sx = 0, 0
for i in range(n):
for j in range(m):
if grid[i][j] == '2':
sy, sx = i, j
grid[i][j] = '0'
break
dy, dx = [-1, 1, 0, 0], [0, 0, -1, 1]
visited = [[False for _ in range(m)] for _ in range(n)]
def real_man():
q = deque()
q.append((sy, sx, l, r))
visited[sy][sx] = True
result = 1
while q:
y, x, l_cnt, r_cnt = q.popleft()
for i in range(2):
ny, nx = y+dy[i], x+dx[i]
while 0 <= ny < n and 0 <= nx < m and not visited[ny][nx] and grid[ny][nx] == '0':
visited[ny][nx] = True
result += 1
q.append((ny, nx, l_cnt, r_cnt))
ny, nx = ny+dy[i], nx+dx[i]
if l_cnt > 0:
ny, nx = y+dy[2], x+dx[2]
if 0 <= ny < n and 0 <= nx < m and not visited[ny][nx] and grid[ny][nx] == '0':
visited[ny][nx] = True
result += 1
q.append((ny, nx, l_cnt-1, r_cnt))
if r_cnt > 0:
ny, nx = y+dy[3], x+dx[3]
if 0 <= ny < n and 0 <= nx < m and not visited[ny][nx] and grid[ny][nx] == '0':
visited[ny][nx] = True
result += 1
q.append((ny, nx, l_cnt, r_cnt-1))
return result
print(real_man())