반응형
BFS 기본코드에 이동 좌표만 수정해주었습니다.
import java.util.*;
import java.io.*;
public class Main {
static StringBuilder sb = new StringBuilder();
static int[] dx = new int[]{1, 2, 2, 1, -1, -2, -2, -1};
static int[] dy = new int[]{2, 1, -1, -2, -2, -1, 1, 2};
static int N;
static int[][] visited;
static int[] dest;
static Queue<int[]> Q;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
while(T-- >0){
Q = new LinkedList<>();
N = Integer.parseInt(br.readLine());
visited = new int[N][N];
for (int i=0; i<N; i++)
Arrays.fill(visited[i], -1);
int[] start = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
dest = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
if (start[0] == dest[0] && start[1] == dest[1]){
sb.append("0\n");
continue;
}
Q.offer(start);
visited[start[0]][start[1]] = 0;
bfs();
}
System.out.print(sb);
}
static void bfs(){
while (!Q.isEmpty()){
int[] cur = Q.poll();
for (int dir=0; dir<8; dir++){
int nx = cur[1] + dx[dir];
int ny = cur[0] + dy[dir];
if (ny == dest[0] && nx == dest[1]){
sb.append(visited[cur[0]][cur[1]]+1+"\n");
return;
}
if (nx<0 || nx>=N || ny<0 || ny>=N) continue;
if (visited[ny][nx] >=0 ) continue;
visited[ny][nx] = visited[cur[0]][cur[1]] + 1;
Q.offer(new int[]{ny, nx});
}
}
}
}
반응형
'Algorithm' 카테고리의 다른 글
백준 2468번 안전 영역 [ Java ] (0) | 2021.01.02 |
---|---|
백준 10026번 적록색약 [ Java ] (0) | 2021.01.02 |
백준 2667번 단자번호붙이기 [ Java ] (0) | 2021.01.02 |
백준 2583번 영역 구하기 [ Java ] (0) | 2021.01.01 |
백준 9466번 텀 프로젝트 [ Java ] (0) | 2021.01.01 |