알고리즘/bfs

[백준알고리즘] bfs - 7562번 나이트의 이동 문제

Fenderblue 2023. 5. 13. 22:16

 

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

 

7562번: 나이트의 이동

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

www.acmicpc.net

bfs 활용문제

x가 행을 나타내고 y가 열을 나타내는 의미로 했는데

이 두개 순서를 헷갈려서 여기저기 잘못써놓느라 몇번만에 맞았다..

아오~헷갈리니까 다음부터는 x, y 말고 col, row로 쓰던지 해야겠다.

아직도 행, 열이 헷갈리다니..........

 

package baekjoonWeek5;

import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BJ_7562 {  //백준 나이트의 이동 문제
    static Queue<Point> q = new LinkedList<>();
    static int[][] check;
    static int[] dx = {-1, 1, 2, 2, 1, -1, -2, -2 };
    static int[] dy = {-2, -2, -1, 1, 2, 2, -1, 1};
    static int l;

    static class Point{
        int x; int y;
        public Point(int x, int y){
            this.x = x;
            this.y = 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));
        int T = Integer.parseInt(br.readLine());

        for (int i = 1; i <= T; i++) {
            l = Integer.parseInt(br.readLine());
            check = new int[l][l];
            int curX; int curY;     //현재위치의 각 열, 행
            StringTokenizer st = new StringTokenizer(br.readLine());
            curY = Integer.parseInt(st.nextToken());
            curX = Integer.parseInt(st.nextToken());

            int toGoX; int toGoY;   //가려는 위치의 각 열, 행
            st = new StringTokenizer(br.readLine());
            toGoY = Integer.parseInt(st.nextToken());
            toGoX = Integer.parseInt(st.nextToken());

            q.add(new Point(curX, curY));   //시작점 큐에 추가
            bfs(toGoX, toGoY);
            bw.write(Integer.toString(check[toGoY][toGoX]));
            bw.newLine();
            q.clear();

        }
        bw.flush();
        bw.close();
    }

    static void bfs(int x, int y) {
        while (!q.isEmpty()) {
            Point point = q.poll();
            if (point.x == x && point.y == y) {
                return;
            }
            for (int i = 0; i < 8; i++) {
                int tmpx = point.x + dx[i];
                int tmpy = point.y + dy[i];
                if(tmpy >= 0 && tmpy < l && tmpx >= 0 && tmpx < l && check[tmpy][tmpx] == 0){   //아직 방문안했고 갈수있는 배열범위 내라면
                    q.add(new Point(tmpx, tmpy));
                    check[tmpy][tmpx] = check[point.y][point.x] + 1;
                }
            }
        }

    }
}