[7562 - JAVA] 나이트의 이동
2024. 1. 24. 11:02ㆍAlgorithm
문제
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?
입력
입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.
각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다.
체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.
출력
각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.
정답
import java.util.*;
public class Main {
public static int t, l, sx,sy, ex, ey;
public static boolean[][] visited;
// 왼쪽 상단부터 시계방향으로 이동
public static int[] dx = new int[]{-1, -2, -2, -1, 1, 2, 2, 1};
public static int[] dy = new int[]{-2, -1, 1, 2, 2, 1, -1, -2};
public static int bfs(int x, int y) {
Queue<int[]> q = new LinkedList<>();
q.add(new int[]{x, y, 0});
visited = new boolean[l][l];
while (!q.isEmpty()) {
int[] now = q.poll();
int nx = now[0];
int ny = now[1];
int move = now[2];
// 도착
if (nx == ex && ny == ey) {
return move;
}
for (int i = 0; i < 8; i++) {
int nnx = nx + dx[i];
int nny = ny + dy[i];
if (nnx >= 0 && nnx < l && nny >= 0 && nny < l) {
if (!visited[nnx][nny]) {
visited[nnx][nny] = true;
q.add(new int[]{nnx, nny, move + 1});
}
}
}
}
return -1;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
t = sc.nextInt();
for (int i = 0; i < t; i++) {
l = sc.nextInt();
sx = sc.nextInt();
sy = sc.nextInt();
ex = sc.nextInt();
ey = sc.nextInt();
System.out.println(bfs(sx, sy));
}
}
}
오랜만에 풀어서 그런가 조금 헷갈렸다 전형적인 bfs 문제로 이코테의 왕실의 나이트 문제와 어쩌면 유사할지도? 이코테의 경우 나이트의 이동 가능 범위만 구하는거라 훨씬 쉽지만
'Algorithm' 카테고리의 다른 글
[13305 - JAVA] 주유소 (0) | 2024.03.12 |
---|---|
[15649 - JAVA] N과 M (1) (0) | 2024.03.12 |
[2667 - JAVA] 단지번호붙이기 (0) | 2024.01.15 |
[2606 - JAVA] 바이러스 (0) | 2024.01.15 |
[1541 - JAVA] 잃어버린 괄호 (0) | 2024.01.02 |