developerU

[백준] 7562 - 나이트의 이동 자바 본문

Algorithm/BaekJoon

[백준] 7562 - 나이트의 이동 자바

developerU 2022. 3. 24. 02:39

문제

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?

 

입력

입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.

각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.

 

출력

각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.

 

예제 입력

3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1

 

예제 출력

5
28
0

 

내 코드

import java.awt.Point;
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 Main_7562 {
	static int T, I;
	static int[][] map;
	static boolean[][] visited;
	
	static int[] dy = {-1,-1,-2,-2,1,1,2,2};	//8개
	static int[] dx = {-2,2,-1,1,-2,2,-1,1};

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		T = Integer.parseInt(br.readLine());
		for (int tc = 1; tc <= T; tc++) {
			I = Integer.parseInt(br.readLine());
			map = new int[I][I];
			visited = new boolean[I][I];
			
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			Point current = new Point(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
			st = new StringTokenizer(br.readLine(), " ");
			Point to = new Point(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
			
			Queue<Point> queue = new LinkedList<>();
			
			queue.offer(current);
			visited[current.y][current.x] = true;
			
			int level = 0;
			here:
			while(!queue.isEmpty()) {
				int qSize = queue.size();
				for(int i=0; i<qSize; i++) {
					Point temp = queue.poll();
					if(temp.y == to.y && temp.x == to.x) {
						System.out.println(level);
						break here;
					}
					
					for(int j=0; j<8; j++) {
						int ny = temp.y + dy[j];
						int nx = temp.x + dx[j];
						
						if(ny<0 || ny>=I || nx<0 || nx>=I) continue;
						if(visited[ny][nx]) continue;
						
						queue.offer(new Point(nx, ny));
						visited[ny][nx] = true;
						
					}
				}
				level++;
			}
		}
		

		br.close();

	}
}

 

 

Comments