[Baekjoon][https://www.acmicpc.net/problem/2178]
지나야 하는 최소 칸 수를 구하는 문제로 -> 너비 우선 탐색(BFS) 알고리즘
미로에서 1은 이동이 가능한 구역으로, 첫 시작 위치 좌표 값(map[0][0])을 Queue에 넣고 BFS 알고리즘을 적용한다.
Queue에 값이 존재 하지 않을 때까지 상, 하, 좌, 우로 이동 가능한 인접한 지역(map[n][m] == 1) &&
방문하지 않은 미로 (visit[n][m] ==0)에 방문하여 해당 좌표 값을 Queue에 추가한다.
지나온 미로 칸 수는 상, 하, 좌, 우 이동이 모두 완료된 시점마다 지나온 칸수를 +1씩 추가해준다.
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Location2178{
int x;
int y;
public Location2178(int x, int y) {
// TODO Auto-generated constructor stub
this.x = x;
this.y = y;
}
}
public class Main {
static int n;
static int m;
static int[][] map;
static int[][] visit;
static Queue<Location2178> q;
static int movement_cnt = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
q = new LinkedList<>();
map = new int[n][m];
visit = new int[n][m];
for(int i=0;i<n;i++){
String str = sc.next();
for(int j=0;j<m;j++) {
map[i][j] = (int)str.charAt(j) - 48;
if(i==0 && j==0 && map[i][j] == 1) {
q.offer(new Location2178(i, j));
visit[i][j] = 1;
}
}
}
getBFS();
System.out.println(movement_cnt+1);
}
public static void getBFS() {
int[] xx = {-1, 0, 1, 0};
int[] yy = {0, 1, 0, -1};
while(!q.isEmpty()) {
int location_size = q.size();
for(int j=0;j<location_size;j++) {
int x = q.peek().x;
int y = q.poll().y;
if(x==n-1 && y== m-1) {
return;
}
for(int i=0;i<4;i++) {
int ax = x+xx[i];
int ay = y+yy[i];
if(ax >=0 && ax<n && ay>=0 && ay<m) {
if(map[ax][ay] == 1 && visit[ax][ay] == 0)
{
q.offer(new Location2178(ax, ay));
visit[ax][ay] = 1;
}
}
}
}
movement_cnt++;
}
}
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[Baekjoon] #2606 바이러스 (0) | 2020.09.02 |
---|---|
[Baekjoon] #3184 양 (0) | 2020.04.28 |
[ Baekjoon ] #7576 토마토 (0) | 2020.04.22 |
[ Baekjoon ] #5427 불 (0) | 2020.04.20 |
[ Baekjoon ] #4179 불! (0) | 2020.04.19 |