나이트의 이동 7562

LJM·2023년 2월 8일
0

백준풀기

목록 보기
79/259

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

어렵게 생각할 필요없이 그냥 다음 놓을 수 있는 위치를 너비탐색 하면된다

다만 몇번을 가야 도착하는지 부분에서 어려웠는데 visit 을 boolean 에서 int 로 바꿔서 방문횟수를 기록해서 해결하였다

import java.io.*;
import java.util.*;

class Pos
{
    int x;
    int y;

    public Pos() {
    }

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

    public boolean compare(Pos obj) {
        return (this.x == obj.x && this.y == obj.y);
    }
}

public class Main
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int tc = Integer.parseInt(br.readLine());
        String[] input;
        int boardSize = 0;
        Pos start = new Pos();
        Pos end = new Pos();
        Pos cur = new Pos();
        Queue<Pos> que = new LinkedList<>();

        for(int i = 0; i < tc; ++i)
        {

            boardSize = Integer.parseInt(br.readLine());
            int[][] visit = new int[boardSize][boardSize];

            input = br.readLine().split(" ");
            start.x = Integer.parseInt(input[0]);
            start.y = Integer.parseInt(input[1]);

            input = br.readLine().split(" ");
            end.x = Integer.parseInt(input[0]);
            end.y = Integer.parseInt(input[1]);

            que.add(start);
            visit[start.x][start.y] = 1;

            while(start.compare(end)== false && que.isEmpty() == false)
            {
                cur = que.poll();

                if(AddNext(cur, end, boardSize, visit, que))
                {
                    break;
                }
            }

            System.out.println(visit[end.x][end.y]-1);
            que.clear();
        }

    }

    private static boolean AddNext(Pos cur, Pos end, int boardSize, int[][] visit, Queue<Pos> que)
    {
        int dir = 8;
        Pos[] newPos = new Pos[dir];
        newPos[0] = new Pos(cur.x-1, cur.y-2);  //upLeft
        newPos[1] = new Pos(cur.x+1, cur.y-2);  //upRight
        newPos[2] = new Pos(cur.x+2, cur.y-1);  //rightUp
        newPos[3] = new Pos(cur.x+2, cur.y+1);  //rightDown
        newPos[4] = new Pos(cur.x+1, cur.y+2);  //downRight
        newPos[5] = new Pos(cur.x-1, cur.y+2);  //downLeft
        newPos[6] = new Pos(cur.x-2, cur.y+1);  //leftDown
        newPos[7] = new Pos(cur.x-2, cur.y-1);  //leftUp

        for(int i = 0; i < dir; ++i)
        {
            if(newPos[i].compare(end))
            {
                visit[newPos[i].x][newPos[i].y] = visit[cur.x][cur.y]+1;
                return true;
            }


            if(newPos[i].x >= 0 && newPos[i].x < boardSize
                    && newPos[i].y >= 0 && newPos[i].y < boardSize
                    && visit[newPos[i].x][newPos[i].y] == 0)
            {
                que.add(newPos[i]);
                visit[newPos[i].x][newPos[i].y] = visit[cur.x][cur.y]+1;
            }
        }

        return false;
    }
}
profile
게임개발자 백엔드개발자

0개의 댓글