BOJ_2178_미로 탐색
2021. 9. 17. 11:55ㆍ백준 알고리즘(BOJ)
1
구분: 그래프 이론, 그래프 탐색, BFS
언어: Java
전략:
BFS 풀어야 하는 이유 - 최단 거리를 구해야 하는데 DFS는 깊게 탐색하니까 비효율적이다. 시간 초과
방법1 - 내가 다녀온 곳들을 1씩 증가 - 최종 도착지에 도달했을 때의 그 숫자가 정답
방법 2 - 내가 방문한 곳들을 확인하는 boolean 배열이용해서 방문여부 확인. 큐에 좌표와 level도 함께 넣는다.
인접한 곳에 level을 1씩 증가한다.
2. 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int h, w;
static int[][] map;
static boolean[][] check;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
h = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
map = new int[h][w];
check = new boolean[h][w];
for(int i = 0; i<h; i++) {
String str = br.readLine();
for(int j = 0; j<w; j++) {
map[i][j] = str.charAt(j)-'0';
}
}
//int result = bfs(0,0);
//System.out.println(result);
bfs2(0,0,1);
//System.out.println(lev);
}//main
static int[] dx = {1,-1,0,0};
static int[] dy = {0,0,1,-1};
static class Node{
int y;
int x;
Node(int y, int x){
this.x = x;
this.y = y;
}
}
static class Node2{
int x;
int y;
int level;
Node2(int y, int x, int level){
this.y = y;
this.x = x;
this.level = level;
}
}
private static int bfs(int y, int x) {
Queue<Node> q = new LinkedList<>();
q.offer(new Node(y, x));
while(!q.isEmpty()) {
Node node = q.poll();
int qy = node.y;
int qx = node.x;
for(int d = 0; d<4; d++) {
int nx = qx + dx[d];
int ny = qy + dy[d];
if(nx<0 || ny<0 ||nx>=w|| ny>=h || map[ny][nx]==0)
continue;
if(map[ny][nx]==1) {
q.offer(new Node(ny, nx));
map[ny][nx] = map[qy][qx]+1;
}
}
}
return map[h-1][w-1];
}
private static void bfs2(int y, int x, int level) {
Queue<Node2> q = new LinkedList<>();
q.offer(new Node2(y, x, level));
check[y][x] = true;
while(!q.isEmpty()) {
Node2 node = q.poll();
int qy = node.y;
int qx = node.x;
int lev = node.level;
for(int d = 0; d<4; d++) {
int nx = qx + dx[d];
int ny = qy + dy[d];
//범위 벗어나거나 0이거나 이미 방문한 곳이면 그냥 지나가
if(nx<0 || ny<0 ||nx>=w|| ny>=h || map[ny][nx]==0 ||check[ny][nx])
continue;
//내가 원하는 곳에 도달하면 정답 출력
if(!check[ny][nx]&& nx == w-1 && ny == h-1 && map[ny][nx]==1) {
System.out.println(lev+1);
return;
}
//일반적일 경우 그냥 레벨1 증가해서 큐에 삽입
q.offer(new Node2(ny,nx,lev+1));
check[ny][nx] = true;
}
}
}
}
3
BFS를 연습하기 좋은 문제이다.
'백준 알고리즘(BOJ)' 카테고리의 다른 글
BOJ_1697_숨바꼭질 (0) | 2021.09.22 |
---|---|
BOJ_1600_ 말이 되고픈 원숭이 (0) | 2021.09.17 |
BOJ_17086_아기 상어2 (0) | 2021.09.15 |
BOJ_2644_촌수계산 (0) | 2021.09.15 |
BOJ_2529_부등호 (0) | 2021.09.08 |