문제설명
미로의 구조를 입력받고 미로의 시작점에서 끝점에 도달하는 최소한의 이동거리를 구하는 문제입니다.
작동 순서
1. 미로의 크기 N,M을 입력받습니다.
2. 미로의 구조를 입력받습니다.
3. 미로를 BFS방식으로 탐색합니다.
4. 인접한 칸이 이동할 수 있는 곳일 경우 그 곳으로 이동하고 count를 +1해줍니다.
5. 마지막 칸에 도달하면 그 칸 까지 이동하는데 걸린 이동거리를 출력합니다.
소스코드
import java.io.*;
import java.util.*;
public class 백준_2178번_미로탐색 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int N=Integer.parseInt(input[0]), M=Integer.parseInt(input[1]);
int[][] move = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
int[][] map=new int[N][M];
boolean[][] visited = new boolean[N][M];
for(int i=0;i<N;i++){
input = br.readLine().split("");
for(int j=0;j<M;j++) map[i][j]=Integer.parseInt(input[j]);
}
Queue<Integer> queueX = new LinkedList<>();
Queue<Integer> queueY = new LinkedList<>();
Queue<Integer> queueCount = new LinkedList<>();
queueX.add(0);
queueY.add(0);
queueCount.add(0);
visited[0][0]=false;
while(!queueX.isEmpty()){
int x = queueX.poll();
int y = queueY.poll();
int count = queueCount.poll();
if(x==N-1 & y==M-1){
System.out.print(count+1);
}
for(int i=0;i<4;i++){
if(x+move[i][0]>=0 & x+move[i][0]<N & y+move[i][1]>=0 & y+move[i][1]<M){
if(map[x+move[i][0]][y+move[i][1]]==1 & !visited[x+move[i][0]][y+move[i][1]]){
queueX.add(x+move[i][0]);
queueY.add(y+move[i][1]);
queueCount.add(count+1);
visited[x+move[i][0]][y+move[i][1]]=true;
}
}
}
}
}
}