Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Algorithm
- recursion
- 딕셔너리
- Python
- 투 포인터
- 외적
- Two Pointers
- CCW 알고리즘
- 비트연산
- ccw
- 너비우선탐색
- 에라토스테네스의 체
- CCW알고리즘
- 재귀
- 에라토스테네스
- 알고리즘
- 큐
- 이진 탐색
- 소수
- 백준
- dijkstra algorithm
- 비트마스킹
- BOJ
- DP
- 다익스트라
- Bitmasking
- 위상정렬
- deque
- binary search
- BFS
Archives
- Today
- Total
꾸꾸리
[BOJ/Python] 7562_나이트의 이동 본문
728x90
문제 출처:https://www.acmicpc.net/problem/7562
7562번: 나이트의 이동
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수
www.acmicpc.net
문제
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?

입력
입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.
각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.
출력
각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.
예제 입력 1
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
예제 출력 1
5
28
0
풀이
우선 코드는 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
import sys
import collections
move=[(2,1),(2,-1),(1,2),(1,-2),(-2,1),(-2,-1),(-1,2),(-1,-2)]
def bfs(l,start,end,visited):
if start==end:
return 0
queue = collections.deque()
queue.append(start)
visited[start[0]][start[1]]=True
count = 1
distance = 1
while queue:
x,y = queue.popleft()
count -=1
for i in move:
px = x+i[0]
py = y+i[1]
if 0<=px<l and 0<=py<l:
if px==end[0] and py==end[1]:
return distance
if visited[px][py]==False:
visited[px][py]=True
queue.append((px,py))
if count==0:
distance+=1
count = len(queue)
t = int(sys.stdin.readline())
for _ in range(t):
l = int(sys.stdin.readline())
start = tuple(map(int,sys.stdin.readline().split()))
end = tuple(map(int,sys.stdin.readline().split()))
visited=[[False for _ in range(l)] for _ in range(l)]
print(bfs(l,start,end,visited))
|
cs |
- BFS를 이용하여 문제를 해결하였다.
- move 리스트의 경우, 나이트가 현재 좌표에서 움직일 수 있는 8방향에 대한 dx와dy의 정보이다.
- bfs 함수의 경우, 체스판의 크기와, 출발점과 도착점, 그리고 방문여부에 대한 리스트를 입력받는다.
- 만약 출발점과 도착점이 같다면 이동을 안 해도 되므로 0을 return 한다.
- 그게 아니라면 출발점을 큐에 넣고 방문표시를 해준다.
- 큐에 원소가 존재하는 동안 반복한다.
- move 리스트를 이용하여 현재 좌표를 기준으로 8방향을 탐색한다. (체스판 내부에 존재할 경우에 한하여 탐색한다.)
- 만약 도착점을 찾는다면 distance를 return 한다.
- 도착점은 아니지만 방문하지 않은 좌표라면 방문표시를 해주고 큐에 넣어준다.
728x90
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ/Python] 14938_서강그라운드 (0) | 2023.02.20 |
---|---|
[BOJ/Python] 4195_친구 네트워크 (0) | 2023.02.19 |
[BOJ/Python] 2056_작업 (0) | 2023.02.16 |
[BOJ/Python] 14567_선수과목 (Prerequisite) (0) | 2023.02.15 |
[BOJ/Python] 16562_친구비 (0) | 2023.02.14 |