https://www.acmicpc.net/problem/2178
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
문제풀이
BFS(넓이우선탐색) 를 활용합니다.
BFS를 사용하는 간단한 문제였습니다.
다만, 처음 시작할때도 1 을 가지고 시작해야한다는점을 유의해야합니다.
코드
import java.util.*; public class Main { public static int N,M; public static char[][] Map; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); M = sc.nextInt(); Map = new char[N][M]; for(int i=0;i<N;i++) { String str = sc.next(); for(int j=0;j<M;j++) { Map[i][j] = str.charAt(j); // System.out.print(" "+Map[i][j]); } // System.out.println(); } BFS(new Node(0,0, 1)); } public static void BFS(Node start) { Queue<Node> q = new LinkedList<>(); boolean[][] visited = new boolean[N][M]; q.offer(start); visited[start.x][start.y] = true; int[] dx = new int[] {-1,1,0,0}; int[] dy = new int[] {0,0,-1,1}; while(!q.isEmpty()) { Node temp = q.poll(); int x = temp.x; int y = temp.y; int cnt = temp.cnt; if( x == N-1 && y == M-1) { System.out.println(cnt); return ; } for(int i=0;i<4;i++) { int nx = x + dx[i]; int ny = y + dy[i]; if( nx < 0 || nx >= N || ny < 0 || ny >= M) {continue;} if(Map[nx][ny] == '0' || visited[nx][ny] == true) continue; q.offer(new Node(nx, ny, cnt+1)); visited[nx][ny] = true; } } } } class Node{ int cnt=0; int x; int y; public Node(int x, int y, int cnt) { this.x=x; this.y=y; this.cnt=cnt; } }
정답코드2입니다.
package Main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { static int N, M, S, P, A, B, X, L, R, C, n, k, m, l, K, D, T; static int answer = 0; static int[] arr = new int[10001]; static char[][] matrix = new char[101][101]; 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()); for(int i=0;i<N; i++) { st = new StringTokenizer(br.readLine()); matrix[i] = st.nextToken().toCharArray(); } System.out.println(BFS(0, 0)); } static int BFS(int sr, int sc) { Queue<int[]> q = new LinkedList<>(); q.offer(new int[] {sr, sc, 1}); boolean[][] visited = new boolean[101][101]; visited[sr][sc] = false; while(!q.isEmpty()) { int[] temp = q.poll(); if(temp[0] == N-1 && temp[1] == M - 1) return temp[2]; for(int[] dir : new int[][] {{0, 1}, {0, -1}, {-1, 0}, {1, 0}}) { int nr = temp[0] + dir[0]; int nc = temp[1] + dir[1]; int nCnt = temp[2] + 1; if(nr < 0 || nr >= N || nc < 0 || nc >= M) continue; if(visited[nr][nc] == true) continue; if(matrix[nr][nc] == '0') continue; q.offer(new int[] {nr, nc, nCnt}); visited[nr][nc] = true; } } return -1; } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 16918 봄버맨 - BFS (0) | 2023.06.17 |
---|---|
[백준] 2667 단지번호붙이기 - BFS(넓이우선탐색) JAVA (0) | 2023.06.14 |
[백준] 1325 효율적인 해킹 - BFS(깊이우선탐색) JAVA (0) | 2023.06.11 |
[백준] 1260 DFS와 BFS - DFS(깊이우선탐색) + BFS(넓이우선탐색) JAVA (0) | 2023.06.11 |
[백준] 2606: 바이러스 - BFS(너비우선탐색) + 유니온 파인드(UnionFind, Disjoint set) JAVA (0) | 2023.06.11 |