https://www.acmicpc.net/problem/7562
7562번: 나이트의 이동
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수
www.acmicpc.net
import sys
from collections import deque
# 나이트가 움직일 수 있는 모든 경우의 수
move = [[1,2],[1,-2],[-1,2],[-1,-2],[2,1],[2,-1],[-2,1],[-2,-1]]
# bfs 시작
def bfs(x, y,target_x,target_y):
# 만약의 현재 위치와 목표 위치가 같으면 0을 리턴
if x == target_x and y == target_y:
return 0
# bfs를 해주기위해 큐를 만든다.
now_state = deque()
# 큐에 현재 나이트가 위치한 좌표를 넣어준다
now_state.append([x,y])
# 이제 while문을 돌면서 큐에 들어있는 나이트의 위치들을 꺼낸다.
while now_state:
a, b = now_state.popleft()
# 만약에 큐에서 나온 나이트의 위치와 목표 위치가 같다면 그자리의 값을 리턴해준다.
if a == target_x and b == target_y:
return chess[target_x][target_y]
# 이제 for문을 위의 move 리스트의 길이만큼 나이트를 움직여준다.
for i in range(8):
# 위에 큐에서 나온 a,b를 이제 움직여서 nx,ny에 저장해준다.
nx = a + move[i][0]
ny = b + move[i][1]
# 이동한 위치가 체스판 밖을 나가지 않고 이동한 체스판이 지금까지 방문을 한번도 하지 않았다면
if -1 < nx < l and -1 < ny < l and chess[nx][ny] ==0:
# 그위치의 값에 1을 더해주고
chess[nx][ny] = chess[a][b] + 1
# 나이트의 위치를 큐에 넣어준다.
now_state.append([nx, ny])
n = int(sys.stdin.readline())
for i in range(n):
l = int(sys.stdin.readline())
chess = [[0] * l for _ in range(l)]
x, y = map(int,sys.stdin.readline().split())
target_x,target_y =map(int,sys.stdin.readline().split())
print(bfs(x, y,target_x,target_y))
bfs를 잘알고 있다면 풀만한 문제이다.
반응형
'알고리즘 공부 > BFS & DFS' 카테고리의 다른 글
[백준] 14502번 연구소- 파이썬 (0) | 2022.03.26 |
---|---|
[백준] 7569번 토마토 - 파이썬 (0) | 2022.02.22 |
[백준] 7576번 토마토 - 파이썬 (0) | 2022.02.19 |
[백준] 2178번 미로 탐색 - 파이썬 (0) | 2021.08.18 |
[백준] 1012번 유기농 배추 - 파이썬 (0) | 2021.08.18 |