본문 바로가기

Algorithm

[백준/Python] 데스 나이트

문제

게임을 좋아하는 큐브러버는 체스에서 사용할 새로운 말 "데스 나이트"를 만들었다. 데스 나이트가 있는 곳이 (r, c)라면, (r-2, c-1), (r-2, c+1), (r, c-2), (r, c+2), (r+2, c-1), (r+2, c+1)로 이동할 수 있다.

크기가 N×N인 체스판과 두 칸 (r1, c1), (r2, c2)가 주어진다. 데스 나이트가 (r1, c1)에서 (r2, c2)로 이동하는 최소 이동 횟수를 구해보자. 체스판의 행과 열은 0번부터 시작한다.

데스 나이트는 체스판 밖으로 벗어날 수 없다.

 

입력

첫째 줄에 체스판의 크기 N(5 ≤ N ≤ 200)이 주어진다. 둘째 줄에 r1, c1, r2, c2가 주어진다.

 

출력

첫째 줄에 데스 나이트가 (r1, c1)에서 (r2, c2)로 이동하는 최소 이동 횟수를 출력한다. 이동할 수 없는 경우에는 -1을 출력한다.

 

예제

 

 

 

16948번: 데스 나이트

게임을 좋아하는 큐브러버는 체스에서 사용할 새로운 말 "데스 나이트"를 만들었다. 데스 나이트가 있는 곳이 (r, c)라면, (r-2, c-1), (r-2, c+1), (r, c-2), (r, c+2), (r+2, c-1), (r+2, c+1)로 이동할 수 있다. 크

www.acmicpc.net

 

풀이

from collections import deque

n = int(input())
r1, c1, r2, c2 = map(int, input().split())
chess = [[0] * n for _ in range(n)]

dx = [-2,-2,0,0,2,2]
dy = [-1,1,-2,2,-1,1]

def bfs(x,y):
  queue = deque()
  queue.append((x,y))
  while queue:
    x,y = queue.popleft()
    for i in range(6):
      nx = x+dx[i]
      ny = y+dy[i]
      if 0 <= nx < n and 0 <= ny < n and chess[nx][ny] == 0:
        chess[nx][ny] = chess[x][y] + 1
        if nx==r2 and ny==c2:
          return chess[nx][ny]
        queue.append((nx, ny))
  return -1

print(bfs(r1,c1))

'Algorithm' 카테고리의 다른 글

[백준/Python] 숫자 카드  (0) 2021.10.09
[백준/Python] 단지번호붙이기  (0) 2021.10.09
[백준/Python] 숫자판 점프  (0) 2021.10.05
[프로그래머스 Level2] H-Index  (0) 2021.10.04
[백준/Python] 회의실 배정  (0) 2021.10.04