[너비 우선 탐색 BFS] 도 그래프를 완전 탐색하는 방법 중 하나로 시작 노드에서 출발해 시작노드를 기준으로 가까운 노드를 먼저 방문하면서 탐색하는 알고리즘(FIFO) 입니다. 선입선출 방식으로 탐색하므로 큐를 이용해 구현합니다.
너비 우선 탐색의 핵심 이론
1.BFS를 시작할 노드를 정한 후 사용할 자료구조 초기화 하기 (DFS와 동일하지만 스택대신 큐를 사용한다는 점에서 다름)
2. 큐에서 노드를 꺼낸 후 꺼낸 노드의 인접 노드를 다시 큐에 삽입하기
3. 큐 자료구조에 값이 없을 때 까지 반복
백준 2178 미로 찾기 문제에 적용해보기
public class 미로탐색 {
static int[] dx = {0,1,0,-1};
static int[] dy = {1,0,-1,0}; //각각 위, 오른쪽, 아래, 왼쪽으로 탐색해라!
static boolean[][] visited;
static int[][] a;
static int n,m;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
a = new int[n][m]; //미로 지도
visited = new boolean[n][m];
//미로 지도 초기화
for (int i = 0; i<n; i++) {
st = new StringTokenizer(br.readLine());
String line = st.nextToken();
for (int j=0;j<m;j++){
a[i][j] = Integer.parseInt(line.substring(j,j+1));
}
}
BFS(0,0);
System.out.println(a[n-1][m-1]);
}
private static void BFS(int i, int j) {
Queue<int[]> queue = new LinkedList<>(); //bfs는 큐로 구현
queue.offer(new int[] {i,j});
while (!queue.isEmpty()){
int now[] = queue.poll();
visited[i][j] = true;
for (int k = 0; k<4; k++) {
//상하좌우로 탐색
int x = now[0] + dx[k];
int y = now[1] + dx[k];
if (x>=0 && y>=0 && x<n &&y<m) { //배열을 넘어가면 안됨
if(a[x][y] != 0 && !visited[x][y]){ //0이어서 갈 수 없거나 들른 곳은 안됨
//갈 수 있는 곳
visited[x][y] = true;
a[x][y] = a[now[0]][now[1]] +1; //핵심 포인트
queue.add(new int[] {x,y});
}
}
}
}
}
}
'코딩테스트' 카테고리의 다른 글
[정수론] 백준 1929 (0) | 2024.03.01 |
---|---|
[그리디 알고리즘] 백준 11047, 백준 1541 (0) | 2024.02.29 |
[이진 탐색] 백준 1920 (0) | 2024.02.28 |
[깊이 우선 탐색 DFS] 백준 11724 (0) | 2024.02.27 |
[삽입 정렬] & [퀵 정렬] & [병합 정렬] & [기수 정렬] (2) | 2024.02.27 |