https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$ 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽
www.acmicpc.net
di=[0,1,0,-1]
dj=[-1,0,1,0]
d_lst = [[0,1,2,3],[3,0,1,2],[2,3,0,1],[1,2,3,0]] # 바라보는 방향에 따른 좌하우상 순 탐색
back = [1,0,3,2]
def bfs(x,y,d):
cnt = 1
q=[(x,y)]
arr[x][y] = 2
while q:
i, j = q.pop(0)
for k in range(4):
ni, nj = i+di[d_lst[d][k]], j+dj[d_lst[d][k]]
if 0<=ni<N and 0<=nj<M and arr[ni][nj] == 0: # 청소할 곳 있으면
d = (d-k+3)%4 # 청소할 곳으로 방향전환
arr[ni][nj] = 2 # 해당 자리 청소
cnt += 1
q.append((ni,nj)) # 한칸 전진
break # 전진했으니 다시 탐색
else: # 청소할 곳 없으면
ki, kj = i+di[back[d]], j+dj[back[d]]
if 0<=ki<N and 0<=kj<M and arr[ki][kj] != 1: # 방향 유지한채로 후진할수있으면
q.append((ki,kj)) # 후진
else: # 벽이라 후진할 수 없으면
return cnt # 함수 종료
return cnt
N, M = map(int, input().split())
r,c,d = map(int, input().split()) # 로봇청소기의 초기상태
# d= 0 북 1 동 2 남 3 서
arr = [list(map(int,input().split())) for _ in range(N)]
# 0 -> 청소x / 1 -> 벽
print(bfs(r,c,d))
'백준' 카테고리의 다른 글
백준 1459. 걷기 (0) | 2023.10.18 |
---|---|
백준 2195. 문자열 복사 (0) | 2023.10.10 |
백준 9205. 맥주 마시면서 걸어가기 (0) | 2023.09.21 |
백준 2573. 빙산 (0) | 2023.09.20 |
백준 2468. 안전 영역 (0) | 2023.09.20 |