[白俊]2178号迷宮探索/Java,Python
Baekjoon Online Judge
algorithm practice
-問題を逐次解く
24.DFSとBFS
グラフを巡るアルゴリズムを学びましょう.
Java/Python
5.迷宮を探る
2178号
BFSの特徴は,各頂点に最短経路でアクセスすることである.この点を利用して最短距離を求める.
迷路では、1は移動可能なセルを、0は移動できないセルを、(1、1)から(N、M)の位置に移動する際に作成する必要がある最小セル数のプログラムです.1つのセルから別のセルに移動する場合は、隣接するセルにのみ移動できます.(BFSは使用されています.)
import java.io.*;
import java.util.*;
public class Main {
static int[] dr = {1, -1, 0, 0};
static int[] dc = {0, 0, -1, 1};
static int N, M;
static int[][] map;
static boolean[][] check; // 방문 여부
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[N][M];
check = new boolean[N][M];
for(int i = 0; i < N; i++){
st = new StringTokenizer(br.readLine());
String str = st.nextToken();
for(int j = 0; j < M; j++){
map[i][j] = str.charAt(j) - '0';
}
}
bfs(0,0);
bw.write(map[N-1][M-1] + "\n");
bw.flush();
bw.close();
br.close();
}
public static void bfs(int x, int y){
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[] {x, y});
while(!queue.isEmpty()) {
int temp[] = queue.poll();
check[x][y] = true;
for(int i = 0; i < 4; i++) {
int r = temp[0] + dr[i];
int c = temp[1] + dc[i];
if(r >= 0 && c >= 0 && r < N && c < M) {
if(map[r][c] != 0 && !check[r][c]){
queue.offer(new int[] {r,c});
check[r][c] = true;
map[r][c] = map[temp[0]][temp[1]] + 1;
}
}
}
}
}
}
import sys
N, M = map(int, sys.stdin.readline().split())
matrix = [sys.stdin.readline().rstrip() for _ in range(N)]
check = [[0]*M for _ in range(N)]
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
# BFS 경로 탐색
# queue 방식 사용
queue = [(0,0)]
check[0][0] = 1
while queue:
x, y = queue.pop(0)
if x == N-1 and y == M-1:
print(check[x][y]) # 최종 경로 도착
break
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < N and 0 <= ny < M:
if check[nx][ny] == 0 and matrix[nx][ny] == '1':
check[nx][ny] = check[x][y] + 1
queue.append((nx,ny))
Reference
この問題について([白俊]2178号迷宮探索/Java,Python), 我々は、より多くの情報をここで見つけました https://velog.io/@jini_eun/백준-2178번-미로-탐색-Java-Pythonテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol