https://www.acmicpc.net/problem/2178
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
- 미로 문제의 경우 bfs(Queue) 이용하는 것이 좋다
- 두 개의 값, 여기서는 좌표(1,2)를 set로 묶어서 사용하려면 class를 이용하는 것이 빠르다!
- arr[x][y]에 저장된 값을 q에서 꺼낼 때마다 +1씩 하면, 도착지인 (n,m)에서의 arr[n][m] 값이 최소 칸 수 값이 된다.
import java.io.*;
import java.util.*;
public class Main{
static int[][] arr;
static boolean[][] check;
static int n,m;
static Queue<Point> q = new LinkedList<>(); //Point class type을 저장
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());
arr = new int[n+1][m+1];
check = new boolean[n+1][m+1];
for(int i=1; i<=n; i++) {
String[] lines = br.readLine().split("");
for(int j=1; j<=m; j++) {
arr[i][j] = Integer.parseInt(lines[j-1]);
}
}
bfs(1,1);
System.out.println(arr[n][m]);
}
public static void bfs(int x, int y) {
int[] dx = {1, 0, -1, 0};
int[] dy = {0, 1, 0, -1};
check[x][y] = true;
q.add(new Point(x, y));
while(!q.isEmpty()) {
Point now_point = q.remove();
for(int i=0; i<dx.length; i++) {
int xx = now_point.x + dx[i];
int yy = now_point.y + dy[i];
if(xx>0 && yy>0 && xx<=n && yy<=m) {
if(!check[xx][yy] && arr[xx][yy]==1) {
check[xx][yy] = true;
arr[xx][yy] = arr[now_point.x][now_point.y] + 1;
q.add(new Point(xx, yy));
}
}
}
}
}
}
class Point{
int x;
int y;
Point(int x, int y){
this.x = x;
this.y = y;
}
}
'개발 > 알고리즘' 카테고리의 다른 글
[프로그래머스] 스택/큐 - 같은 숫자는 싫어 (0) | 2024.10.07 |
---|---|
[프로그래머스] 해시 - 완주하지 못한 선수 (1) | 2024.10.02 |
[알고리즘] 백준 1260번: DFS, BFS (1) | 2023.05.04 |
[알고리즘] 백준 1700번: BufferedReader, StringTokenizer (0) | 2023.05.03 |
[알고리즘] 백준 1152번 (0) | 2023.05.01 |
댓글