본문 바로가기
알고리즘 이전/재귀, DFS, BFS, Tree, Graph

미로의 최단거리(BFS)

by hoshi03 2023. 8. 31.

뭔가 기존 자료형으로 안될거 같으면 클래스를 만들어서 사용해보자

 

7*7 격자판 미로를 탈출하는 최단경로의 길이를 출력

입력

0 0 0 0 0 0 0
0 1 1 1 1 1 0
0 0 0 1 0 0 0
1 1 0 1 0 1 1
1 1 0 1 0 0 0
1 0 0 0 1 0 0
1 0 1 0 0 0 0

 

출력. 도착할 수 없으면 -1를 출력한다.

12

 

풀이

 

 

 

한 지점에서 상하좌우 지점으로 이동하는 것을 레벨 탐색으로 생각하고 board 배열 이동 횟수를 저장할 dis 배열을 만든 후

이동할때마다 기존 배열의 이동횟수 +1을 하면서 레벨 탐색한다, 마지막에 dis[7][7] 칸이 0이면 마지막 칸 까지 도달한 방법이 없는거라 -1, 아니면 dis[7][7]의 값을 리턴한다

 

 

일단 좌표를 저장할 Pointer 클래스를 만들어준다

 

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

 

 

BFS함수에서는 처음에 1,1 좌표를 받아오니 큐에 1,1 좌표를 넣고 큐가 비어있지 않은(갈 곳이 있는) 상태일때마다 큐에 넣어주고 그 칸의 이동횟수를 현재 이동횟수 +1로 만들면서 탐색한다

public void BFS(int x, int y){
        Queue<Point> Q = new LinkedList<>();
        Q.add(new Point(x,y));
        board[x][y] = 1;
        int L = 0;

        while (!Q.isEmpty()){
            Point tmp = Q.poll();
            for (int i = 0; i <4; i++){
                int nx = tmp.x + dx[i];
                int ny = tmp.y + dy[i];
                if (nx >= 1 && nx <= 7 && ny >= 1 && ny <= 7 && board[nx][ny] == 0){
                    Q.add(new Point(nx,ny));
                    board[nx][ny] = 1;
                    dis[nx][ny] = dis[tmp.x][tmp.y] + 1;
                }
            }
        }
    }

 

전체 코드

 

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    static int max = -1;
    static int[][] board;
    static int[][] dis; // 이동횟수를 저장할 배열
    static int[] dx= {-1, 0, 1, 0};
    static  int[] dy = {0, 1, 0, -1};

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

    public void Solution(){

    }

    public void BFS(int x, int y){
        Queue<Point> Q = new LinkedList<>();
        Q.add(new Point(x,y));
        board[x][y] = 1;
        int L = 0;

        while (!Q.isEmpty()){
            Point tmp = Q.poll();
            for (int i = 0; i <4; i++){
                int nx = tmp.x + dx[i];
                int ny = tmp.y + dy[i];
                if (nx >= 1 && nx <= 7 && ny >= 1 && ny <= 7 && board[nx][ny] == 0){
                    Q.add(new Point(nx,ny));
                    board[nx][ny] = 1;
                    dis[nx][ny] = dis[tmp.x][tmp.y] + 1;
                }
            }
        }
    }


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Main T = new Main();

        board = new int[8][8];
        dis = new int[8][8];

        for (int i  = 1; i <= 7; i++) {
            for(int j = 1; j <= 7; j++) board[i][j] = in.nextInt();
        }

        T.BFS(1,1);

        if (dis[7][7] == 0) System.out.println(-1);
        else System.out.println(dis[7][7]);
    }
}

'알고리즘 이전 > 재귀, DFS, BFS, Tree, Graph' 카테고리의 다른 글

섬나라 아일랜드(DFS)  (0) 2023.09.03
토마토(BFS 활용)  (0) 2023.09.01
DFS 미로찾기  (0) 2023.08.31
조합 구하기  (0) 2023.08.25
수열 추측하기  (0) 2023.08.25