"""
17836 백준
"""
from collections import deque
H, W, T = map(int, input().split())
arr = [list(map(int, input().split())) for i in range(H)]
dirs = [
[0,1],
[1,0],
[0,-1],
[-1,0]
]
def bfs():
visited = [[False for i in range(W)] for j in range(H)]
visitSword = [[False for i in range(W)] for j in range(H)]
q = deque([[0,0,0,0]])
visited[0][0] = True
while q:
y, x, t, sword = q.popleft()
if y == H -1 and x == W-1:
if t > T:
print("Fail")
else:
print(t)
return
if sword :
for i in range(2):
ny = y + dirs[i][0]
nx = x + dirs[i][1]
if 0 <= ny < H and 0 <= nx < W and not visitSword[ny][nx]:
visitSword[ny][nx] = True
q.append([ny,nx,t+1,1])
else :
for i in range(4):
ny = y + dirs[i][0]
nx = x + dirs[i][1]
if 0 <= ny < H and 0 <= nx < W and arr[ny][nx] != 1 and not visited[ny][nx]:
if arr[ny][nx] == 2:
visitSword[ny][nx] = True
q.append([ny, nx, t + 1, 1])
else:
visited[ny][nx] = True
q.append([ny, nx, t + 1, 0])
print("Fail")
bfs()
문제 설정이 재밌어서 재밌게 풀었던 문제.
처음에 visit 체크를 하나로 통일해서 풀었다가 실패떠서 원인을 곰곰히 생각해보니 검을 얻고 난 이후의 visit 체크는 따로 해줘야한다. 그렇지 않으면 다음의 테스트케이스를 통과하지 못한다.
테스트 케이스 공유
6 10 50
0 0 0 0 0 0 1 1 0 2
1 1 1 1 0 0 1 0 0 1
1 1 1 1 0 0 1 0 1 1
0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0
검을 오른쪽 위에서 얻고 바로 수직으로 내려오면 20시간만에 공주를 찾지만 만약 visit 배열을 하나로 체크하면 검을 얻고 난 이후에는 내려올 수가 없다.. 그냥 단순히 검을 얻고난 이후의 visit을 따로 체크해주면 되므로 어려운 문제가 아니었다.
https://www.acmicpc.net/problem/17836
'컴퓨터 > 코테' 카테고리의 다른 글
2022 블라인드 카카오 1차 2차 코딩테스트 후기 (0) | 2021.09.26 |
---|---|
백준 1890 점프 - [dp] (0) | 2021.09.23 |
삼성 기출 9660 번호 붙이기 (0) | 2021.09.13 |
백준 1987 알파벳 - bfs (0) | 2021.09.12 |
블록이동하기(드론 조종) - bfs (0) | 2021.09.10 |