https://www.acmicpc.net/problem/17836
17836번: 공주님을 구해라!
용사는 마왕이 숨겨놓은 공주님을 구하기 위해 (N, M) 크기의 성 입구 (1,1)으로 들어왔다. 마왕은 용사가 공주를 찾지 못하도록 성의 여러 군데 마법 벽을 세워놓았다. 용사는 현재의 가지고 있는
www.acmicpc.net
풀이
bfs()알고리즘을 이용해서 문제를 풀어주면 됩니다. 다만 벽을 부술 수 있는 그람을 발견하면 벽과 상관없이 공주를 찾으러 갈 수 있기 때문에 그람을 찾는순간 그 위치에서 최단거리를 계산해주면 됩니다.
코드
# 17836번 공주님을 구해라!
# 0은 빈공간 1은 벽 2는 그람을 의미한다.
import sys
from collections import deque
input = sys.stdin.readline
n, m, t = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(n)]
visited = [[0]*m for _ in range(n)]
dxys = ((0,1),(0,-1),(1,0),(-1,0))
def bfs():
queue = deque([])
queue.append([0,0])
visited[0][0] = 1
gram = []
had_gram = 10001
had_no_gram = 10001
while queue:
c_x, c_y = queue.popleft()
for dx, dy in dxys:
n_x = c_x + dx
n_y = c_y + dy
if 0 <= n_x < m and 0 <= n_y < n and visited[n_y][n_x] == 0 and grid[n_y][n_x] != 1:
visited[n_y][n_x] = visited[c_y][c_x] + 1
queue.append([n_x, n_y])
if grid[n_y][n_x] == 2:
gram.append([n_x, n_y, visited[n_y][n_x]])
if gram:
gram_x, gram_y, cost = gram[0]
had_gram = (n-(gram_y+1)) + (m-(gram_x+1)) + cost - 1
if visited[n-1][m-1]:
had_no_gram = visited[n-1][m-1] - 1
return min(had_gram, had_no_gram)
spend_time = bfs()
# 제한시간안에 들어왔을 경우 계산된 시간을 출력해줍니다.
if t >= spend_time:
print(spend_time)
else:
print("Fail")
출력결과
'백준 > DFS&BFS' 카테고리의 다른 글
[백준][Python] 2573번 빙산 - 코팩 (0) | 2023.05.24 |
---|---|
[백준][Python] 1987번 알파벳 - 코팩 (0) | 2023.05.22 |
[백준][Python] 13565번 침투 - 코팩 (0) | 2023.03.30 |
[백준][Python] 16928번 뱀과 사다리 게임 - 코팩 (0) | 2023.03.28 |
[백준][Python] 14716번 현수막 - 코팩 (0) | 2023.03.27 |