[Silver III] 세 번 이내에 사과를 먹자 - 26169
분류
백트래킹, 깊이 우선 탐색, 그래프 이론, 그래프 탐색
문제 설명
5 x 5 크기의 보드가 주어진다. 보드는 1 x 1 크기의 정사각형 격자로 이루어져 있다. 보드의 격자는 사과가 1개 있는 격자, 장애물이 있는 격자, 빈칸으로 되어 있는 격자로 구분된다. 격자의 위치는 (r, c)로 표시한다. r은 행 번호, c는 열 번호를 나타낸다. 행 번호는 맨 위 위치가 0이고 아래 방향으로 1씩 증가한다. 열 번호는 맨 왼쪽 위치가 0이고 오른쪽으로 1씩 증가한다. 즉, 맨 왼쪽 위 위치가 (0, 0), 맨 아래 오른쪽 위치가 (4, 4)이다.
현재 한 명의 학생이 (r, c) 위치에 있고 한 번의 이동으로 상, 하, 좌, 우 방향 중에서 한가지 방향으로 한 칸 이동할 수 있다. 학생이 사과가 있는 칸으로 이동하면 해당 칸에 있는 사과를 1개 먹는다. 장애물이 있는 칸으로는 이동할 수 없다. 학생이 지나간 칸은 학생이 해당 칸을 떠나는 즉시 장애물이 있는 칸으로 변경된다. 즉, 학생이 해당 칸에서 상, 하, 좌, 우 방향으로 한 칸 이동하는 즉시 해당 칸은 장애물이 있는 칸으로 변경된다.
학생이 현재 위치 (r, c)에서 세 번 이하의 이동으로 사과를 2개 이상 먹을 수 있으면 1을 출력하고, 그렇지 않으면 0을 출력하자.
입력
첫 번째 줄부터 다섯 개의 줄에 걸쳐 보드의 정보가 주어진다. i번째 줄의 j번째 수는 보드의 (i - 1)번째 행, (j - 1)번째 열의 정보를 나타낸다. 보드의 정보가 1이면 해당 칸은 사과가 1개 있는 격자임을 나타내고, 0이면 빈칸이 있는 격자를 나타내고, -1이면 장애물이 있는 격자임을 나타낸다.
다음 줄에 학생의 현재 위치 r, c가 빈칸을 사이에 두고 순서대로 주어진다.
출력
첫 번째 줄에 학생이 현재 위치 (r, c)에서 세 번 이하의 이동으로 사과를 2개 이상 먹을 수 있으면 1을 출력하고, 먹을 수 없으면 0을 출력한다.
import sys
input = sys.stdin.readline
def DFS(r, c, apple, cnt):
global result
if cnt <= 3 and apple >= 2:
result = 1
return
if cnt > 3:
return
visited[r][c] = 1
for dr, dc in delta:
nr = dr + r
nc = dc + c
if 0 <= nr < 5 and 0 <= nc < 5 and visited[nr][nc] != 1:
if board[nr][nc] == 1:
DFS(nr, nc, apple + 1, cnt + 1)
elif board[nr][nc] == 0:
DFS(nr, nc, apple, cnt + 1)
visited[r][c] = 0
return
delta = [(-1, 0), (0, 1), (1, 0), (0, -1)]
board = [list(map(int, input().split())) for _ in range(5)]
visited = [[0] * 5 for _ in range(5)]
r, c = map(int, input().split())
result = 0
DFS(r, c, 0, 0)
print(result)
'Algorithm > BAEKJOON' 카테고리의 다른 글
[백준 / Python 파이썬] 1972번 - 놀라운 문자열 (0) | 2023.05.06 |
---|---|
[백준 / Python 파이썬] 16165번 - 걸그룹 마스터 준석이 (0) | 2023.05.06 |
[백준 / Python 파이썬] 25328번 - 문자열 집합 조합하기 (0) | 2023.04.29 |
[백준 / Python 파이썬] 19949번 - 팩토리얼 0의 개수 (0) | 2023.04.29 |
[백준 / Python 파이썬] 1676번 - 팩토리얼 0의 개수 (0) | 2023.04.26 |