728x90
문제 출처: https://www.acmicpc.net/problem/7562
7562번: 나이트의 이동
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수
www.acmicpc.net
문제
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?
![](https://blog.kakaocdn.net/dn/bnoFvP/btrFlFougkA/dOWFSchwOaBQVphAoSwuDk/img.png)
입력
입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.
각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.
출력
각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.
정답
import sys
from collections import deque
def bfs(graph, x, y, c, d):
dx = [-2,-1,-2,-1,2,1,2,1]
dy = [-1,-2,1,2,-1,-2,1,2]
deq = deque()
deq.append((x,y))
graph[x][y] = 1
while deq:
x,y = deq.popleft()
if x == c and y == d:
return graph[x][y]-1
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx > N-1 or ny <0 or ny > N-1:
continue
if graph[nx][ny] == 0:
deq.append((nx,ny))
graph[nx][ny] = graph[x][y] + 1
T = int(sys.stdin.readline().rstrip())
for i in range(T):
N = int(sys.stdin.readline().rstrip())
graph = [[0]*N for _ in range(N)]
a, b = map(int, sys.stdin.readline().split())
c, d = map(int, sys.stdin.readline().split())
if a == c and b == d:
print(0)
continue
answer = bfs(graph, a, b, c, d)
print(answer)
graph로 2차원 배열을 만든후 a, b에서 출발하여 c, d로 도착하게 세팅하면 되는 문제입니다.
처음 값에 1을 넣어주고 bfs를 돌면서 도착지점을 찾아서 -1을 한 후 출력하면 정답입니다.
728x90
'코딩 > 백준' 카테고리의 다른 글
[백준/파이썬/브루트포스] 3085번 사탕 게임 코딩테스트 연습풀이 (0) | 2022.06.23 |
---|---|
[백준/파이썬/자료구조] 17413번 단어 뒤집기 2 코딩테스트 연습풀이 (0) | 2022.06.22 |
[백준/파이썬/DP] 2193번 이진수 코딩테스트 연습풀이 (0) | 2022.06.19 |
[백준/파이썬/자료구조] 5397번 키로거 코딩테스트 연습풀이 (0) | 2022.06.18 |
[백준/파이썬/브루트포스] 1120번 문자열 코딩테스트 연습풀이 (0) | 2022.06.17 |