반응형
문제 요약)
- 나이트의 위치가 주어지고 8방향으로 이동이 가능
- 시작점부터 도착지점까지의 이동 거리 출력
주의점)
- 8방향 좌표만 잘 기억하면 큰 어려움 x
풀이)
보통은 4방향 탐색을 많이 하는데 약간 응용해서
8방향으로 탐색을 하는 문제이기에 방향만 잘 정해서
8방향 탐색루프를 돌며 bfs 진행
정답)
*Scanner 대신 bufferedReader를 사용하면 시간을 더 줄일 수 있습니다.
import java.util.*;
public class KnightMove7562_blog {
static int[] dx = {-1, -2, -2, -1, 1, 2, 2, 1}; // 8방향 탐색
static int[] dy = {-2, -1, 1, 2, 2, 1, -1, -2};
static int t;
static int n;
static int[][] map;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
t = sc.nextInt();
for (int i = 0; i< t; i++) {
n = sc.nextInt();
map = new int[n][n];
int beginX = sc.nextInt();
int beginY = sc.nextInt();
int endX = sc.nextInt();
int endY = sc.nextInt();
BFS(beginX, beginY);
System.out.println(map[endX][endY] - 1); // 1로 시작했기 때문에 -1 해주기
}
}
static void BFS(int x, int y) {
Queue<int[]> q = new LinkedList<>();
q.offer(new int[] {x, y});
map[x][y] = 1; // 1로 해줘야 방문한곳 판단이 쉬워서
while(!q.isEmpty()) {
int[] current = q.poll();
for (int i=0; i<dx.length; i++) {
int nextX = current[0] + dx[i];
int nexY = current[1] + dy[i];
// out of index 방지, 이미 방문한 곳 제외
if (nextX < 0 || nextX >= n || nexY < 0 || nexY >= n) continue;
if (map[nextX][nexY] > 0) continue;
q.offer(new int[] {nextX, nexY});
map[nextX][nexY] = map[current[0]][current[1]] + 1;
}
}
}
}
반응형
'코테 > 문제풀이' 카테고리의 다른 글
[백준] 3055 탈출 자바 BFS 문제 풀이 및 정답 (0) | 2024.03.01 |
---|---|
[백준] 2178 미로 탐색 자바 BFS 문제 풀이 및 정답 (0) | 2024.02.29 |
[백준] 7576 토마토 자바 BFS 문제 풀이 및 정답 (1) | 2024.02.29 |
[백준] 유기농 배추 자바 BFS 풀이(메모리 초과 나는 이유) (1) | 2024.02.26 |
[백준]17413번 단어뒤집기 자바 정답 코드 (0) | 2023.11.15 |