알고리즘/백준
7562번 : 나이트의 이동
코딍코딍
2022. 8. 25. 13:53
https://www.acmicpc.net/problem/7562
7562번: 나이트의 이동
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수
www.acmicpc.net
문제
코드
import java.io.*;
import java.util.*;
public class Main {
static int[][] g;
static int dx[] = {-1, -2, -2, -1, 1, 2, 2, 1};
static int dy[] = {-2, -1, 1, 2, 2, 1, -1, -2};
static int l;
static int startX;
static int startY;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int t = Integer.parseInt(br.readLine());
for(int i=0;i<t;i++) {
l = Integer.parseInt(br.readLine());
g = new int[l][l];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
startX = Integer.parseInt(st.nextToken());
startY = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine(), " ");
int endX = Integer.parseInt(st.nextToken());
int endY = Integer.parseInt(st.nextToken());
g[startX][startY] = 0;
bfs(startX, startY);
sb.append(g[endX][endY]+"\n");
}
bw.write(sb+"");
bw.flush();
}
public static void bfs(int i, int j) {
Queue<int[]> q = new LinkedList<>();
q.add(new int[]{i, j});
while(!q.isEmpty()) {
int node[] = q.poll();
i = node[0];
j = node[1];
for (int k = 0; k < 8; k++) {
int x = i + dx[k];
int y = j + dy[k];
if (x < 0 || y < 0 || x >= l || y >= l || (x==startX && y==startY)) continue;
if (g[x][y] == 0) {
g[x][y] = g[i][j] + 1;
q.add(new int[]{x, y});
}
}
}
}
}
해결방법
bfs를 사용하였고 이동할때마다 이전 칸의 값+1을 해주면몇 번만에 해당 칸으로 이동했는 지 알 수 있어 문제를 해결할 수 있다.
45L의 범위를 벗어나면 continue; 하도록 한 코드의 조건에 (x==startX && y==startY) 를 추가한 이유는 이를 추가해야 출발좌표와 도착좌표가 동일할 때 결과값이 0이 나오기 때문이다.