문제
7562번: 나이트의 이동
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수
www.acmicpc.net
풀이
최단 거리와 관련된 그래프 탐색 문제는 너비 우선 탐색(BFS)를 통해 해결한다.
큐에 좌표(y,x)와 함께 이동횟수(cnt)를 함께 삽입하여 탐색시 1씩 증가하게 한다.
만약 이동하려는 칸의 좌표에 도달하면 이동횟수를 출력하고 탐색을 종료한다.
코드
import sys, collections
dx = [-2, -2, -1, -1, 1, 1, 2, 2]
dy = [1, -1, 2, -2, 2, -2, 1, -1]
def bfs(cur, target):
q = collections.deque([])
q.append(cur+[0]) # 0 == cnt
visited[cur[0]][cur[1]] = 1
while q:
y, x, cnt = q.popleft()
if y == target[0] and x == target[1]:
print(cnt)
break
for i in range(8):
ny = y + dy[i]
nx = x + dx[i]
if 0 <= ny < l and 0 <= nx < l:
if not visited[ny][nx]:
visited[ny][nx] = 1
q.append([ny, nx, cnt + 1])
n = int(sys.stdin.readline().strip())
for _ in range(n):
l = int(sys.stdin.readline())
visited = [[0 for _ in range(l)] for _ in range(l)]
cur_pos = [int(x) for x in sys.stdin.readline().split()]
target_pos = [int(x) for x in sys.stdin.readline().split()]
bfs(cur_pos, target_pos)
'CS > 알고리즘 문제 풀이' 카테고리의 다른 글
[백준] 11403 - 경로 찾기 [Python(파이썬)] (0) | 2021.01.16 |
---|---|
[백준] 2133 - 타일 채우기 [Python(파이썬)] (0) | 2021.01.16 |
[백준] 2293 - 동전1 [Python(파이썬)] (0) | 2021.01.12 |
[백준] 11057-오르막 수 [Python(파이썬)] (0) | 2021.01.10 |
[백준] 1182 - 부분수열의 합 [Python(파이썬)] (0) | 2021.01.10 |
문제
7562번: 나이트의 이동
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수
www.acmicpc.net
풀이
최단 거리와 관련된 그래프 탐색 문제는 너비 우선 탐색(BFS)를 통해 해결한다.
큐에 좌표(y,x)와 함께 이동횟수(cnt)를 함께 삽입하여 탐색시 1씩 증가하게 한다.
만약 이동하려는 칸의 좌표에 도달하면 이동횟수를 출력하고 탐색을 종료한다.
코드
import sys, collections
dx = [-2, -2, -1, -1, 1, 1, 2, 2]
dy = [1, -1, 2, -2, 2, -2, 1, -1]
def bfs(cur, target):
q = collections.deque([])
q.append(cur+[0]) # 0 == cnt
visited[cur[0]][cur[1]] = 1
while q:
y, x, cnt = q.popleft()
if y == target[0] and x == target[1]:
print(cnt)
break
for i in range(8):
ny = y + dy[i]
nx = x + dx[i]
if 0 <= ny < l and 0 <= nx < l:
if not visited[ny][nx]:
visited[ny][nx] = 1
q.append([ny, nx, cnt + 1])
n = int(sys.stdin.readline().strip())
for _ in range(n):
l = int(sys.stdin.readline())
visited = [[0 for _ in range(l)] for _ in range(l)]
cur_pos = [int(x) for x in sys.stdin.readline().split()]
target_pos = [int(x) for x in sys.stdin.readline().split()]
bfs(cur_pos, target_pos)
'CS > 알고리즘 문제 풀이' 카테고리의 다른 글
[백준] 11403 - 경로 찾기 [Python(파이썬)] (0) | 2021.01.16 |
---|---|
[백준] 2133 - 타일 채우기 [Python(파이썬)] (0) | 2021.01.16 |
[백준] 2293 - 동전1 [Python(파이썬)] (0) | 2021.01.12 |
[백준] 11057-오르막 수 [Python(파이썬)] (0) | 2021.01.10 |
[백준] 1182 - 부분수열의 합 [Python(파이썬)] (0) | 2021.01.10 |