문제 링크
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
풀이
- 처음에는 bfs로 접근했는데 그래프 구현 문제
# 그래프 문제
# 왼쪽으로 회전하기 때문에 반드시 해당 순서여야 한다
dx = [ -1, 0, 1, 0 ]
dy = [ 0, 1, 0, -1 ]
# 왼쪽으로 회전
def turn():
global d
d = (d-1) % 4
n, m = map(int,input().split())
x, y, d = map(int,input().split())
graph = []
for _ in range(n):
graph.append(list(map(int,input().split())))
# 출발 지점 방문 표시
graph[x][y] = 2
count = 1
while True :
# 네 방향에 청소할 공간이 있는지 확인
check = False
# 4방향 왼쪽으로 회전
for _ in range(4):
turn()
nx = x + dx[d]
ny = y + dy[d]
if 0 <= nx < n and 0<= ny < m :
# 청소할 공간이 있다면
if graph[nx][ny] == 0 :
count += 1
# 방문 표시
graph[nx][ny] = 2
# 청소할 공간이 있음을 표시
check = True
# 이동
x, y = nx, ny
# 회전 중단
break
# 청소할 공간이 없다면
if not check :
# 후진
nx = x - dx[d]
ny = y - dy[d]
if 0<= nx < n and 0<= ny < m :
# 후진
if graph[nx][ny] == 2 :
x, y = nx, ny
# 벽이라 후진할 수 없다면
if graph[nx][ny] == 1 :
print(count)
break
# 후진할 수 없다면
else :
print(count)
break
'개발 > algorithm' 카테고리의 다른 글
[백준 1085번] 직사각형에서 탈출 - python (0) | 2022.02.12 |
---|---|
[백준 2231번] 분해합 - python (0) | 2022.02.12 |
[백준 14502번] 연구소 -python (0) | 2022.02.10 |
[백준 13458번] 시험 감독 -python (0) | 2022.02.10 |
[백준 3190번] 뱀 - python (0) | 2022.02.10 |