# # 1600 말이 되고픈 원숭이
from collections import deque
K = int(input())
W,H = map(int,input().split())
arr = [list(map(int,input().split())) for _ in range(H)]
stack = deque()
stack.append((0,0,0,K))
visited = [[[0 for z in range(K+1)] for y in range(W)] for _ in range(H)]
visited[0][0][0] = 1
horse_move = [(-2,-1),(-1,-2),(1,-2),(2,-1),(2,1),(1,2),(-1,2),(-2,1)]
move = [(-1,0),(1,0),(0,-1),(0,1)]
result = -1
while stack:
x,y,cnt,horse_cnt = stack.popleft()
if x+1 == H and y+1 == W:
result = cnt
break
for dx,dy in move:
nx = x + dx
ny = y + dy
if 0<=nx<H and 0<=ny<W:
if not arr[nx][ny]:
if not visited[nx][ny][horse_cnt]:
stack.append((nx,ny,cnt+1,horse_cnt))
visited[nx][ny][horse_cnt] = 1
if horse_cnt:
for dx,dy in horse_move:
nx = x + dx
ny = y + dy
if 0<=nx<H and 0<=ny<W:
if not arr[nx][ny]:
if not visited[nx][ny][horse_cnt-1]:
stack.append((nx,ny,cnt+1,horse_cnt-1))
visited[nx][ny][horse_cnt-1] = 1
print(result)
이 문제는 두가지의 이동방식이 있고, 그것을 구분해서 BFS를 해주면 된다. 하지만 여기서 주의할 점은 다음과 같다.
방문 표시를 체크를 하는데 주의를 해야한다.
1
4 4
0 0 0 0
0 0 0 0
0 0 1 1
0 0 1 0
위와 같이 되어 있다고 했을시, 방문표시를 따로 구분하지 않고 한가지로 했을시에는, 말로 왔는지, 원숭이로 왔는지 정확히 모르기 때문에 원하는 답이 안나올 수 있다.
그래서 visitied를 기존의 x,y 좌표 뿐만아니라 말의 이동회수를 기준까지 포함해서, 방문표시를 해주었다. 이부분만 조심해주면, 문제를 풀 수 있다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 2631 줄세우기 (0) | 2021.02.16 |
---|---|
[BOJ/백준] 2873 롤러코스터 (0) | 2021.02.16 |
[BOJ/백준] 11758 CCW (0) | 2021.02.16 |
[BOJ/백준] 5557 1학년 (0) | 2021.02.16 |
[BOJ/백준] 2493 탑 (0) | 2021.02.16 |