공부/코테 풀이
백준 7562번: 나이트의 이동
확두뇌
2023. 12. 18. 20:46
이 문제는 4 * 4 체스판을 직접 그려보고 한 시작점에서 모든 칸을 몇 칸 안에 도달할 수 있는지 직접 구해본다면 접근 방법을 찾을 수 있다.
다음은 4 * 4 체스판의 (0,0)에서 출발 했을 때 모든 칸에 도달하는 최소 이동 횟수다.
만약 (3,2) 칸에 몇 번만에 도달하는지 알고 싶다면 체스판을 그래프화 하여 graph[3][2]의 값을 구하면 된다.

다음은 손 코딩으로 흐름을 나타낸 것이다.

다음은 정답 java 코드이다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static int whereIs(int x, int y, int[][] graph, int end_x, int end_y) {
int[] dx = {-1, 1, 2, -2, 2, 1, -2, -1};
int[] dy = {2, 2, 1, 1, -1, -2, -1, -2};
Queue<int[]> queue = new LinkedList<int[]>();
int[] list = {x,y};
queue.add(list);
while(queue.size()!=0) {
int[] data = queue.poll();
int cur_i = data[0];
int cur_j = data[1];
for(int r=0; r<8; r++) {
int next_i = cur_i + dx[r];
int next_j = cur_j + dy[r];
if(next_i>=0 && next_i<graph.length && next_j>=0 && next_j<graph[0].length) {
if(graph[next_i][next_j] < 0) {
graph[next_i][next_j] = graph[cur_i][cur_j]+1;
int[] next_list = {next_i, next_j};
queue.add(next_list);
}
}
}
}
return graph[end_x][end_y];
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(st.nextToken());
for(int i=0; i<n; i++) {
st = new StringTokenizer(br.readLine());
int k = Integer.parseInt(st.nextToken()); //k * k
int[][] graph = new int[k][k]; //초기화값 = 0
for(int j=0; j<k; j++) {
for(int p=0; p<k; p++) {
graph[j][p] = -1;
}
}
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
graph[x][y] = 0;
st = new StringTokenizer(br.readLine());
int end_x = Integer.parseInt(st.nextToken());
int end_y = Integer.parseInt(st.nextToken());
sb.append(whereIs(x, y, graph, end_x, end_y)+"\n");
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
}