Algorithm/백준
[백준] 16948 데스 나이트
SSONGMI
2021. 4. 29. 22:23
반응형
문제 출처: www.acmicpc.net/problem/16948
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
: 크기가 NxN인 체스판에서 r1, c1, r2, c2가 주어질 때 (r1, c1)에서 (r2, c2)로 이동하는 최소 이동 횟수를 구해야 한다.
: 최소 이동 횟수이기 때문에 bfs 방식을 생각할 수 있다.
: 데스 나이트가 이동하는 규칙은 델타배열로 만들어 사용할 수 있도록 한다.
: 도착점이 주어져 있기 때문에 체스판의 지점들을 방문하던 중 도착점에 도달하면 그 때까지 걸린 횟수를 반환한다.
: 도착 지점에 도달하지 못한다면 중간에 return 되지 않으므로 도착점까지 해당 규칙으로 갈 수 없다는 뜻이 된다. 따라서 -1을 반환한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class 데스나이트 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
static int N;
static int[][] map;
static int startR, startC, endR, endC;
static class Point{
int r, c, cnt;
public Point(int r, int c, int cnt) {
super();
this.r = r;
this.c = c;
this.cnt = cnt;
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
N = Integer.parseInt(br.readLine());
map = new int[N][N];
st = new StringTokenizer(br.readLine());
startR = Integer.parseInt(st.nextToken());
startC = Integer.parseInt(st.nextToken());
endR = Integer.parseInt(st.nextToken());
endC = Integer.parseInt(st.nextToken());
int res = bfs(startR, startC);
System.out.println(res);
}
static int[] dr = {-2, -2, 0, 0, 2, 2};
static int[] dc = {-1, 1, -2, 2, -1, 1};
private static int bfs(int r, int c) {
boolean[][] v = new boolean[N][N];
Queue<Point> q = new LinkedList<>();
q.offer(new Point(r, c, 0));
v[r][c] = true;
while(!q.isEmpty()) {
Point cur = q.poll();
if(cur.r == endR && cur.c == endC) {
return cur.cnt;
}
for(int i = 0 ; i < 6; i++) {
int nr = cur.r + dr[i];
int nc = cur.c + dc[i];
if(nr < 0 || nr >= N || nc < 0 || nc >= N || v[nr][nc]) continue;
q.offer(new Point(nr, nc, cur.cnt+1));
v[nr][nc] = true;
}
}
return -1;
}
}
반응형