알고리즘/DFS, BFS, 시뮬, 백트래킹

[백준] 7562번 나이트의 이동 #Java

VIPeveloper 2022. 5. 27. 15:12
728x90
반응형

bfs 간단한 문제

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

class Point{
    int x,y;
    public Point(int x,int y){
        this.x = x;
        this.y = y;
    }
}

public class Main {

    static int dx[] = {-1,-2,-2,-1,1,2,2,1};
    static int dy[] = {-2,-1,1,2,2,1,-1,-2};
    static int [][] arr;
    static boolean [][] check;
    static int x,y,ex,ey,N;

    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){
            N = Integer.parseInt(br.readLine());
            arr = new int[N][N];
            check = new boolean[N][N];
            StringTokenizer st = new StringTokenizer(br.readLine()," ");
            x = Integer.parseInt(st.nextToken());
            y = Integer.parseInt(st.nextToken());
            check[x][y] = true;

            st = new StringTokenizer(br.readLine()," ");
            ex = Integer.parseInt(st.nextToken());
            ey = Integer.parseInt(st.nextToken());

            bfs();
        }
    }

    private static void bfs() {

        Queue<Point> q = new LinkedList<>();
        q.offer(new Point(x,y));

        while (!q.isEmpty()){
            int len = q.size();
            for (int j = 0; j < len; j++) {
                Point poll = q.poll();
                if(poll.x == ex && poll.y == ey){
                    break;
                }
                for (int i = 0; i < 8; i++) {
                    int nx = poll.x + dx[i];
                    int ny = poll.y + dy[i];

                    // 범위 체크
                    if(0<= nx && nx < N && 0<= ny && ny < N){
                        // 방문 체크
                        if(!check[nx][ny] && arr[nx][ny]==0){
                            check[nx][ny] = true;
                            arr[nx][ny] = arr[poll.x][poll.y]+1;
                            q.offer(new Point(nx,ny));
                        }
                    }
                }
            }
        }
        System.out.println(arr[ex][ey]);
    }
}
728x90
반응형