본문 바로가기
ALGORITHM/BAEKJOON

[BOJ/Python] 1600. 말이 되고픈 원숭이

by 안녕나는현서 2021. 10. 4.
728x90

📌 문제

https://www.acmicpc.net/problem/1600

 

1600번: 말이 되고픈 원숭이

첫째 줄에 정수 K가 주어진다. 둘째 줄에 격자판의 가로길이 W, 세로길이 H가 주어진다. 그 다음 H줄에 걸쳐 W개의 숫자가 주어지는데, 0은 아무것도 없는 평지, 1은 장애물을 뜻한다. 장애물이 있

www.acmicpc.net

 

📌 문제 접근 방법

  1. 말처럼 움직일 경우와 보통으로 움직일 경우의 델타 배열을 따로 정의
  2. visited를 3차원으로 만들어서 말처럼 움직인 횟수를 인덱스로 각각 다른 리스트에 방문 체크

📌 코드

from collections import deque

def bfs(i, j):
    queue = deque()
    queue.append((i, j, 0))

    visited = [[[0 for _ in range(K+1)] for _ in range(W)] for _ in range(H)]
    visited[i][j][0] = 1

    dxy1 = [(1, 0), (-1, 0), (0, 1), (0, -1)]
    dxy2 = [(2, 1), (2, -1), (-2, 1), (-2, -1),
            (1, 2), (-1, 2), (1, -2), (-1, -2)]

    while queue:
        curr_x, curr_y, cnt = queue.popleft()

        if curr_x == H-1 and curr_y == W-1:
            return visited[curr_x][curr_y][cnt] - 1

        if cnt < K:
            for dx, dy in dxy2:
                nx, ny = curr_x + dx, curr_y + dy

                if 0 <= nx <= H-1 and 0 <= ny <= W-1 and visited[nx][ny][cnt+1] == 0 and board[nx][ny] == 0:
                    visited[nx][ny][cnt+1] = visited[curr_x][curr_y][cnt] + 1
                    queue.append((nx, ny, cnt+1))
        
        for dx, dy in dxy1:
            nx, ny = curr_x + dx, curr_y + dy

            if 0 <= nx <= H-1 and 0 <= ny <= W-1 and visited[nx][ny][cnt] == 0 and board[nx][ny] == 0:
                visited[nx][ny][cnt] = visited[curr_x][curr_y][cnt] + 1
                queue.append((nx, ny, cnt))
        
    return -1


K = int(input())
W, H = map(int, input().split())

board = []
for _ in range(H):
    board.append(list(map(int, input().split())))

print(bfs(0, 0))
728x90

댓글