백준

BOJ 백준 파이썬 1600 말이 되고픈 원숭이

코테봇 2022. 6. 29. 05:43

아주 쉬운 문제다.

전형적인 삼차원 배열을 이용하여 bfs 탐색을 푸는 문제

k번까지 말처럼 이동할 수 있으니

dist=[[[-1]*w for _ in range(h)] for _ in range(k+1)]으로 선언하여

말처럼 이동하면 dist[k+1][nx][ny]=dist[k][x][y]+1,원숭이처럼 이동하면 dist[k][nx][ny]=dist[k][x][y]+1 로 해주면 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import sys
from collections import deque
from itertools import combinations
 
 
if __name__=='__main__':
   # sys.stdin=open("input.txt", "rt")
    
    k=int(input()) ##원숭이처럼 이동할 수 있는 제한 횟수
    w,h=map(int,input().split()) ## w=가로 길이(열), h=세로 길이(행)
 
    board=[list(map(int,input().split())) for _ in range(h)]
    dist=[[[-1]*for _ in range(h)] for _ in range(k+1)]
 
 
    q=deque()
 
    q.append((0,0,0)) ##출발점 (원숭이,x좌표,y좌표)
    dist[0][0][0]=0
    dx=[0,0,-1,1,-1,-2,-2,-1,1,2,2,1]
    dy=[1,-1,0,0,-2,-1,1,2,-2,-1,1,2]
 
    while q:
 
        mk,x,y=q.popleft()
 
        for i in range(12):
            nx=x+dx[i]
            ny=y+dy[i]
 
            if 0<=nx<and 0<=ny<w:
                if board[nx][ny]==0:
                        if i<4:
                          if dist[mk][nx][ny]==-1:
                              dist[mk][nx][ny]=dist[mk][x][y]+1
                              q.append((mk,nx,ny))
                        else:
                            if mk+1<=and dist[mk+1][nx][ny]==-1:
                                dist[mk+1][nx][ny]=dist[mk][x][y]+1
                                q.append((mk+1,nx,ny))
 
    res=float('inf')
    for i in range(k+1):
        if dist[i][h-1][w-1]!=-1:
            res=min(res,dist[i][h-1][w-1]) 
 
    if res==float('inf'):
        print(-1)
    else:
        print(res)
cs