[공부용이기 때문에 코드가 깔끔하지 않을 수 있습니다!]
16948번: 데스 나이트
게임을 좋아하는 큐브러버는 체스에서 사용할 새로운 말 "데스 나이트"를 만들었다. 데스 나이트가 있는 곳이 (r, c)라면, (r-2, c-1), (r-2, c+1), (r, c-2), (r, c+2), (r+2, c-1), (r+2, c+1)로 이동할 수 있다. 크
www.acmicpc.net
문제는 시작 지점 (r1, c1)에서 (r2, c2)까지 가는 것인데 갈 때 x좌표 y좌표가
x: {-2, -2, 0, 0, 2, 2}
y: {-1, 1, -2, 2, -1, 1}
이렇게만 움직일 수 있다. 따라서 위 방향대로 움직였을 때 도착지점까지 몇 번 이동을 해야 하는지 구하는 것이다.
코드
import java.util.*;
public class Main {
static boolean[][] map;
static int dx[] = {-2, -2, 0, 0, 2, 2};
static int dy[] = {-1, 1, -2, 2, -1, 1};
static int n;
static int ex;
static int ey;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
map = new boolean[n][n];
int sx = sc.nextInt();
int sy = sc.nextInt();
map[sx][sy] = true;
ex = sc.nextInt();
ey = sc.nextInt();
map[ex][ey] = true;
System.out.println(bfs(sx, sy));
}
private static int bfs(int x, int y) {
Queue<int[]> q = new LinkedList<>();
q.add(new int[]{x, y, 0});
boolean[][] visit = new boolean[n][n];
visit[x][y] = true;
while (!q.isEmpty()) {
int[] list = q.poll();
int cx = list[0];
int cy = list[1];
int cc = list[2];
for (int i = 0; i < 6; i++) {
int nowX = cx + dx[i];
int nowY = cy + dy[i];
if (nowX >= 0 && nowY >= 0 && nowX < n && nowY < n) {
if (!visit[nowX][nowY]) {
if (nowX == ex && nowY == ey) {
cc++;
return cc;
} else {
visit[nowX][nowY] = true;
q.add(new int[]{nowX, nowY, cc + 1});
}
}
}
}
}
return -1;
}
}
기존에 풀었던 문제들에서 큰 변형 없이 탈출 조건과 return만 잘 해주면 된다.
만약 nowX와 nowY의 값이 종료지점일 때 카운트++해주고 카운트 값 리턴
아니면 움직여도 도착지점까지 가지 못하면 -1을 리턴해주면 된다.
'Coding Test > DFS & BFS' 카테고리의 다른 글
[BFS] 백준 - 2660번: 회장뽑기 Java 풀이 (0) | 2022.12.21 |
---|---|
[BFS] 백준 - 7562번: 나이트의 이동 Java 풀이 (1) | 2022.12.21 |
[BFS] 백준 - 11725번: 트리의 부모 찾기 Java 풀이 (1) | 2022.12.15 |
[BFS] 백준 - 2178번: 미로 탐색 Java 풀이 (0) | 2022.12.14 |
[DFS] 백준 - 1743번: 음식물 피하기 Java 풀이 (0) | 2022.12.06 |