공부방

bfs문제 본문

문법/알고리즘

bfs문제

코딩 화이팅 2023. 4. 5. 23:07

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

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

package DFS_BFS;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class 미로탐색_2178_1 {
	static int[][] map;//2차 배열 선언
	static int n;//y축 길이
	static int m;//x축 길이
	static boolean[][] visit;//방문 배열 2차배열이기 때문에 똑같이 2차 불린형 선언
	static int[] dy= {-1,1,0,0};	
	static int[] dx= {0,0,-1,1};
	//상,하,좌,우
	
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();//y
		m=sc.nextInt();//x
		
		map=new int[n][m];
		for (int i = 0; i < n; i++) {
			String s=sc.next();
			for (int j = 0; j < m; j++) {
				map[i][j]=s.charAt(j)-'0';
			}
		}
		//입력
		
		visit=new boolean[n][m];
		
		visit[0][0]=true;
		//0,0에서 출발하기 위해 bfs의 첫 좌표를 0,0으로 잡음
		//그 값을 true값으로 해주며 bfs시작
		bfs(0,0);
		System.out.println(map[n-1][m-1]);
	}

	private static void bfs(int y, int x) {
		Queue<int[]> q=new LinkedList<int[]>();//bfs메서드가 시작하자마자 바로 큐부터 선언
		q.add(new int[] {y,x});//배열을 큐에 넣어준다.
		//new int[] {y.x}로 바로 큐에 넣어줄 수 있다.
		while (!q.isEmpty()) {//큐에 아무것도 없다면 반복문 종료 bfs에서 필수
			int now[]=q.poll();//바로 제일 앞에 있는 것을 꺼낸다.
			int nowY=now[0];//뒤에서 델타 배열을 쓰기 위해 지금 값의 y값을 저장
			int nowX=now[1];//델타 배열을 쓰기 위해 지금 값의 x값을 저장
			
			for (int i = 0; i <4; i++) {
				int ny=nowY+dy[i];
				int nx=nowX+dx[i];
				//델타 배열을 사용하여 위,아래,좌,우 값을 저장
				
				if (ny>=0&&nx>=0&&ny<n&&nx<m) {//범위 안에 있다면
					if (!visit[ny][nx]&&map[ny][nx]==1) {//방문하지 않은 좌표이고 그 좌표값이 1이라면
						q.add(new int[] {ny,nx});//그 좌표를 큐에 넣는다.
						map[ny][nx]=map[nowY][nowX]+1;//그 좌표의 값을 전의 좌표에 값에 하나씩 더해준다.
						visit[ny][nx]=true;//그 좌표를 들렸다고 하고 마무리
					}
				}
			}
		}
	}
}

bfs-탐색을 하지만 가장 적게 탐색할 때 사용하는 알고리즘, 일단 visit배열이 필요하고 들린 곳은 가지 않고 처음 시작하는 좌표값을 true로 두고 bfs를 시작 Queue를 사용하여 bfs메서드를 시작하자마자 바로 선언해주고 add하고 while문을 시작하여 넣자마자 바로 땡겨주고 그 땡긴 값을 잠시 선언하고 델타배열을 돌려 범위 안에 있고 그 값이 1이면 바로 들렸다고 true처리 해주고 또 넣고 그 값들을 하나씩 더해 1이 있는 길을 쭉 가면서 끝까지 도달했을 때 더했던 값들을 출력하면 된다.

'문법 > 알고리즘' 카테고리의 다른 글

dp기본 문제  (0) 2023.04.15
다익스트라 기본문제  (0) 2023.04.06
find,union  (0) 2023.03.29
dfs문제  (0) 2023.03.28
n과 m(9)  (0) 2023.03.25