파게로그

[백준 2178번] 미로 탐색 본문

콤퓨타 왕왕기초/PS

[백준 2178번] 미로 탐색

파게 2020. 12. 30. 21:11

문제 링크: 2178번 제목

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

 

최단거리를 찾으므로 BFS로 구현하는 것이 유리하며, 방문하는 새로운 칸에는 현재의 칸에 저장된 값보다 1만큼 큰 값을 저장한다.

코드에서는 이용하지 않았지만, maze 배열의 테두리를 0(이동할 수 없는 칸)으로 감싸게 되면 새로 이동할 칸이 maze를 벗어나지 않는지 체크할 필요가 없다.

 

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { ​​​​static class Pos { ​​​​​​​​int row; ​​​​​​​​int col; ​​​​​​​​Pos(int row, int col) { ​​​​​​​​​​​​this.row = row; ​​​​​​​​​​​​this.col = col; ​​​​​​​​} ​​​​} ​​​​static int[][] maze; ​​​​static boolean[][] visit; ​​​​static int n; ​​​​static int m; ​​​​public static void main(String[] args) throws IOException { ​​​​​​​​/* input */ ​​​​​​​​BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ​​​​​​​​int[] mn = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray(); ​​​​​​​​n = mn[0]; ​​​​​​​​m = mn[1]; ​​​​​​​​maze = new int[n][m]; ​​​​​​​​visit = new boolean[n][m]; ​​​​​​​​for (int i = 0; i < n; i++) { ​​​​​​​​​​​​String s = br.readLine(); ​​​​​​​​​​​​for (int j = 0; j < m; j++) ​​​​​​​​​​​​​​​​maze[i][j] = s.charAt(j) - '0'; ​​​​​​​​} ​​​​​​​​/* logic */ ​​​​​​​​int[] drow = {0, 0, 1, -1}; ​​​​​​​​int[] dcol = {1, -1, 0, 0}; // 동서남북 ​​​​​​​​Queue<Pos> queue = new LinkedList<>(); ​​​​​​​​queue.offer(new Pos(0, 0)); ​​​​​​​​visit[0][0] = true; ​​​​​​​​boolean dest = false; ​​​​​​​​int path = 0; ​​​​​​​​while (!queue.isEmpty()) { ​​​​​​​​​​​​Pos cur = queue.poll(); ​​​​​​​​​​​​int row = cur.row; ​​​​​​​​​​​​int col = cur.col; ​​​​​​​​​​​​for (int d = 0; d < 4; d++) { ​​​​​​​​​​​​​​​​int nrow = row + drow[d]; ​​​​​​​​​​​​​​​​int ncol = col + dcol[d]; ​​​​​​​​​​​​​​​​if (nrow<0||ncol<0||nrow>=n||ncol>=m||maze[nrow][ncol]==0) ​​​​​​​​​​​​​​​​​​​​continue; ​​​​​​​​​​​​​​​​if (visit[nrow][ncol]) ​​​​​​​​​​​​​​​​​​​​continue; ​​​​​​​​​​​​​​​​visit[nrow][ncol] = true; ​​​​​​​​​​​​​​​​maze[nrow][ncol] = maze[row][col]+1; ​​​​​​​​​​​​​​​​if (nrow==n-1 && ncol==m-1) { ​​​​​​​​​​​​​​​​​​​​dest = true; ​​​​​​​​​​​​​​​​​​​​break; ​​​​​​​​​​​​​​​​} ​​​​​​​​​​​​​​​​queue.offer(new Pos(nrow, ncol)); ​​​​​​​​​​​​} ​​​​​​​​​​​​if (dest) ​​​​​​​​​​​​​​​​break; ​​​​​​​​} ​​​​​​​​System.out.println(maze[n-1][m-1]); ​​​​} }

 

'콤퓨타 왕왕기초 > PS' 카테고리의 다른 글

[백준 11724번] 연결 요소의 개수  (0) 2020.12.30
[백준 7576번] 토마토  (0) 2020.12.30
[백준 1012번] 유기농 배추  (0) 2020.12.29
[백준 2667번] 단지 번호 붙이기  (0) 2020.12.28
[백준 2606번] 바이러스  (0) 2020.12.28