공부방
bfs문제 본문
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 |