일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MYSQL
- python
- 회고
- softeer
- java
- 코틀린
- 스프링
- 백준알고리즘
- 소프티어
- 1과목
- 코딩봉사
- 정보처리산업기사
- 프로그래머스
- BFS
- 알고리즘
- CJ UNIT
- 백준 알고리즘
- C++
- 공부일지
- 자바
- SW봉사
- 백준
- 문제풀이
- SQL
- kotlin
- 데이터베이스
- 시나공
- programmers
- 파이썬
- 코딩교육봉사
- Today
- Total
JIE0025
[BOJ - BFS] 7562번 : 나이트의 이동 ( python ) 본문
백준 7562 나이트의 이동 - 파이썬
https://www.acmicpc.net/problem/7562
문제
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?
입력
입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.
각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.
출력
각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.
1. 사고하기
- 목표 : 나이트가 목표지점까지 몇번만에 이동할 수 있는가.
- 유형 : bfs/dfs
기본 유형에서 큰 응용은 필요하지 않은 문제였다.
- 이동할 수 있는 좌표를 dr, dc 변수에 만들어준다.
- 기본 bfs코드를 작성
- r, c를 popleft() 로 꺼내준 다음에 r과 c가 이동하려는 좌표인지 체크해준다.
만약 방문하고자 하는 곳이면 visited[r][c]에 저장된 값에서 -1을 출력해준다.
- 테스트케이스가 여러번 존재하는데
밖에서 bfs돌기전에 현재좌표와 목표좌표가 같은지 조사해주고,
만약 같다면 print(0) 해주면 좀더 시간복잡도를 줄일 수 있다.
2. 이 문제를 공유한 이유 >> 이동 좌표는 제대로 만들자!
위의 두 좌표들 중 맞는 좌표는?
....
정답은 두번째 ㅋㅋㅋㅋㅋ
>> dr dc가 각각 1,-1,2,-2가 두개씩 존재해야하는데
위에 dr에 -1이 3개인것을 파악하지 못해서 계속 틀렸었다.
이런 기본적인걸 못잡으면 아무리 코드를 잘 써도 틀렸다고 나오니 주의하자.
#7562_나이트의 이동_dfs/bfs_silver1
from collections import deque
import sys
input = sys.stdin.readline
#dr dc 설정확실하게 하자!!
dr = [-1, -2, -2, -1, 1, 2, 2, 1]
dc = [2, 1, -1, -2, -2, -1, 1, 2]
def bfs(y,x,gr,gc):
queue = deque()
queue.append([y,x])
visited[y][x] = 1
while queue:
r,c = queue.popleft()
if r == gr and c == gc: #방문하고자 하는 곳이면
print(visited[r][c] -1)
return
for i in range(8):
rr = r+dr[i]
cc= c+dc[i]
if (0<=rr<l) and(0<=cc<l) and not visited[rr][cc]:
queue.append([rr,cc])
visited[rr][cc] = visited[r][c] +1
t = int(input())
for _ in range(t):
l = int(input())
nr, nc = map(int,input().split())
gr, gc = map(int,input().split())
if nr == gr and nc == gc:
print(0)
continue
visited =[[False]*l for _ in range(l)]
bfs(nr,nc,gr,gc)
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ - 이분탐색] 16564번 : 히오스 프로그래머 ( python ) (0) | 2022.04.08 |
---|---|
[BOJ - BFS] 1240번 : 노드 사이의 거리 ( python ) (0) | 2022.04.06 |
[BOJ - DFS] 1068번 : 트리 ( python ) (0) | 2022.04.04 |
[BOJ - 이분탐색] 14627번 : 파닭파닭 ( python ) (0) | 2022.04.03 |
[BOJ - 이분탐색] 13702번 : 이상한 술집 ( python ) (0) | 2022.04.01 |