이번 문제는 로봇 청소기의 구동 순서를 구현하고 이를 전체 탐색을 통해 결과 값을 도출하는 문제였다. 그래서 DFS를 이용하여 탐색하기로 하였다. 이 문제에서 어려웠던 점은 방향이 계속 바뀐다는 점이었다. 그래서 우선 dy, dx리스트에 북, 동, 남, 서 순서로 방향을 저장한 후, 현재 바라보는 방향 d에 따라 접근하도록 하였다. 우선 왼쪽을 먼저 보기 때문에 현재 바라보는 방향에서의 왼쪽은 dy, dx에서 (d+3)%4번째 방향이 된다. 이를 통해 4번 반복하며 바라보는 방향의 왼쪽을 탐색하도록 하였고, 만약 청소되어 있거나 벽인 경우에는 왼쪽으로 그냥 돌기만 하도록 하였다. 3번째 조건인 네 방향 청소가 이미 되어 있는 경우에는 뒤쪽 방향에 해당하는 (d+2)%4번째 방향으로 이동하도록 하고, 바라보는 방향 d를 유지한 채로 dfs함수를 재귀호출 하도록 하였다. 이 경우 뒤에가 벽일 경우에는 함수를 종료하도록 하였다.
graph[y][x]
가 0일 경우,graph[y][x]
를 2로 갱신한다.(d+3)%4
로 선언한다. (d에 대한 왼쪽에 해당)y+dy[nd]
, x+dx[nd]
로 선언한다.graph[ny][nx]
가 0일 경우,dfs(ny, nx, nd)
를 재귀호출한다.(d+2)%4
로 갱신한다. (d에 대한 뒤쪽 방향)y+dy[nd]
로 갱신한다.x+dx[nd]
로 갱신한다.graph[ny][nx]
가 1일 경우,dfs(ny, nx, d)
를 재귀호출한다.dfs(cur[0], cur[1], cur[2])
를 호출한다.n, m=map(int, input().split())
cur=list(map(int, input().split()))
graph=[]
for _ in range(n):
graph.append(list(map(int, input().split())))
dy = [-1, 0, 1, 0]
dx = [0, 1, 0, -1]
answer=0
def dfs(y, x, d):
global answer
if graph[y][x]==0:
answer+=1
graph[y][x]=2
for _ in range(4):
nd=(d+3)%4
ny=y+dy[nd]
nx=x+dx[nd]
if graph[ny][nx]==0:
dfs(ny, nx, nd)
return
d=nd
nd=(d+2)%4
ny=y+dy[nd]
nx=x+dx[nd]
if graph[ny][nx]==1:
return
dfs(ny, nx, d)
dfs(cur[0], cur[1], cur[2])
print(answer)