ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.