7576번 토마토 문제와 동일한 유형의 문제다.
BFS를 이용하여 문제를 풀었으며
나이트의 위치와 타겟의 위치가 동일한 경우를 제외 한다면, 토마토 문제와 똑같은 방식으로 해결할 수 있는 문제이다.
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class baekjoon7562 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cycle = sc.nextInt();
int[] aryH = { +2, +2, +1, +1, -1, -1, -2, -2 };
int[] aryW = { +1, -1, +2, -2, +2, -2, +1, -1 };
for (int i = 0; i < cycle; i++) {
int size = sc.nextInt();
int[][] chess = new int[size][size];
boolean[][] visit = new boolean[size][size];
int[][] roundInfo = new int[size][size];
Queue<int[]> q = new LinkedList<>();
int knightH = sc.nextInt();
int knightW = sc.nextInt();
int targetH = sc.nextInt();
int targetW = sc.nextInt();
if (knightH == targetH && knightW == targetW) {
roundInfo[targetH][targetW] = 0;
} else {
q.add(new int[] { knightH, knightW });
}
for (int j = 0; j < size; j++) {
for (int j2 = 0; j2 < size; j2++) {
visit[j][j2] = true;
}
}
while (!q.isEmpty()) {
int[] location = q.poll();
int h = location[0];
int w = location[1];
for (int j = 0; j < 8; j++) {
int newH = h + aryH[j];
int newW = w + aryW[j];
if (newH >= 0 && newW >= 0 && newH < size && newW < size && visit[newH][newW]) {
roundInfo[newH][newW] = roundInfo[h][w] + 1;
visit[newH][newW] = false;
q.add(new int[] { newH, newW });
}
}
}
System.out.println(roundInfo[targetH][targetW]);
}
}
}
'알고리즘 > BFS & DFS' 카테고리의 다른 글
[JAVA] 백준 2146번: 다리 만들기 (0) | 2021.07.14 |
---|---|
[JAVA] 백준 16940번: BFS 스페셜 저지 (0) | 2021.07.13 |
[JAVA] 백준 16947번: 서울 지하철 2호선 (0) | 2021.07.11 |
[JAVA] 백준 16929번: Two Dots (0) | 2021.07.10 |
[JAVA] 백준 7576번: 토마토 (0) | 2021.07.10 |