문제
설명
7*7 격자판 미로를 탈출하는 최단경로의 길이를 출력하는 프로그램을 작성하세요.
경로의 길이는 출발점에서 도착점까지 가는데 이동한 횟수를 의미한다.
출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 벽이고, 0은 도로이다.
격자판의 움직임은 상하좌우로만 움직인다. 미로가 다음과 같다면
위와 같은 경로가 최단 경로의 길이는 12이다.
입력
첫 번째 줄부터 7*7 격자의 정보가 주어집니다.
출력
첫 번째 줄에 최단으로 움직인 칸의 수를 출력한다. 도착할 수 없으면 -1를 출력한다.
예시 입력 1
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
선생님 풀이
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Point {
public int x, y;
Point(int x, int y){
this.x = x;
this.y = y;
}
}
public class Main8_11 {
// 7*7 격자판 미로를 탈출하는 최단경로의 길이를 출력하는 프로그램
// 첫 번째 줄에 최단으로 움직인 칸의 수를 출력한다. 도착할 수 없으면 -1를 출력한다.
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, 1, 0, -1};
static int[][] board, dis;
public void BFS(int x, int y){
Queue<Point> Q = new LinkedList<>();
Q.offer(new Point(x, y));
while(!Q.isEmpty()) {
Point cur = Q.poll();
for (int i = 0; i <= 3; i++) {
int nx = cur.x+dx[i];
int ny = cur.y+dy[i];
if(nx >= 1 && nx <= 7 && ny >= 1 && ny <= 7 && board[nx][ny] == 0) {
board[nx][ny] = 1;
Q.offer(new Point(nx, ny));
dis[nx][ny] = dis[cur.x][cur.y]+1;
}
}
}
}
public static void main(String[] args) {
Main8_11 T = new Main8_11();
Scanner sc = new Scanner(System.in);
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] = sc.nextInt();
}
}
board[1][1] = 1;
T.BFS(1, 1);
if(dis[7][7]==0) System.out.println(-1);
else System.out.println(dis[7][7]);
}
}
BFS니까 무조건 큐 !
그리고 큐 안에 (x, y) 형태의 좌표가 들어가야 하니까 Point 클래스도 만들어 주고 시작했다.
board 배열은 주어진 맵 정보, dis 배열은 해당 좌표의 거리 값을 넣어주면서 최단 거리를 찾는다.
근데 궁금한 건 dis[7, 7] 값이 출발 기준으로 아래쪽 길로 갔을 때 12로 담기지만
큐에 아직 값이 남아있기 때문에 출발 기준으로 오른쪽 길로 갔을 때 16으로 바뀌지 않나?
이 둘 중 최소값으로 넣어주는 로직을 안짰는데 최소값이 들어간다...(????)
여긴 다시 공부 해봐야 겠다.. BFS 어려워.....
----------- 추가 -----------
board[nx][ny] = 1;
이미 탐색한 곳은 1로 만들어 주어 다시 탐색하지 않게 해주기 때문에
출발 기준으로 아래쪽 길로 갔을 때 dis[7, 7]에 12가 담기고, 그 후에는 값이 담기지 않는다.
(출발 기준으로 아래쪽 길로 갔을 때는 dis[7, 7] != 0 이기 때문에 if문 안으로 들어가지 않음)
어차피 BFS는 동시에 사방으로 뻗어서 최단 거리를 찾는 느낌이라 처음으로 값이 담기면 그것이 그냥 최단 거리임 !
결과
'Algorithm > Inflearn' 카테고리의 다른 글
[Inflearn] 자바 알고리즘 문제풀이 #08-13 13. 섬나라 아일랜드(DFS) (0) | 2023.04.28 |
---|---|
[Inflearn] 자바 알고리즘 문제풀이 #08-12 12. 토마토(BFS 활용) (0) | 2023.04.26 |
[Inflearn] 자바 알고리즘 문제풀이 #08-10 10. 미로탐색(DFS) (0) | 2023.04.24 |
[Inflearn] 자바 알고리즘 문제풀이 #08-09 9. 조합 구하기(DFS) (0) | 2023.04.24 |
[Inflearn] 자바 알고리즘 문제풀이 #08-08 8. 순열 추측하기(DFS, 조합, 메모이제이션) (1) | 2023.04.21 |