Problem Solving/Baekjoon

[백준/JAVA] 7562 - 나이트의 이동

jihyeon99 2024. 5. 22. 16:37

문제 정보

https://www.acmicpc.net/problem/7562

 

문제

 

코드

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		// 8방향 벡터
		int[] dx = new int[] {-2,-1,1,2,-2,-1,1,2};
		int[] dy = new int[] {-1,-2,-2,-1,1,2,2,1};
		
		int tc = Integer.parseInt(br.readLine()); // 테스트 케이스 수
		for(int i=0; i<tc; i++) {
			int l = Integer.parseInt(br.readLine()); // 한 변의 길이
			
			boolean[][] visited = new boolean[l][l]; // 방문 여부 저장
			
			StringTokenizer st = new StringTokenizer(br.readLine());
			// 나이트의 초기 좌표
			int[] start = new int[] {Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())};
			st = new StringTokenizer(br.readLine());
			// 나이트의 최종 좌표
			int[] finish = new int[] {Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())};
			
			int cnt = 0; // 이동횟수
			Queue<int[]> queue = new ArrayDeque<>(); // x좌표, y좌표, 현재 시각
			queue.offer(new int[] {start[0], start[1], 0});
			visited[start[0]][start[1]] = true;
			while(!queue.isEmpty()) {
				int[] cur = queue.poll();
				
				// 나이트가 도착 지점에 도착했다면 종료
				if(cur[0] == finish[0] && cur[1] == finish[1]) {
					cnt = cur[2];
					break;
				}
				
				for(int j=0; j<8; j++) {
					int nextx = cur[0] + dx[j];
					int nexty = cur[1] + dy[j];
					
					// 배열의 인덱스 넘지 않고, 방문한 적이 없다면
					if(nextx>=0 && nextx<l && nexty>=0 && nexty<l && !visited[nextx][nexty]) {
						queue.offer(new int[] {nextx, nexty, cur[2]+1}); // 이동 횟수 1 증가
						visited[nextx][nexty] = true;
					}
				}
			}
			
			sb.append(cnt+"\n");
		}
		
		System.out.println(sb.toString());
		
	}
}