import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class maze_search_2178 {
private static int[] dx = {-1, 1, 0, 0};
private static int[] dy = {0, 0, -1, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// n : 세로, m : 가로
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[][] maze = new int[n][m];
for(int i = 0; i < n; i++) {
String line = br.readLine();
for (int j = 0; j < m; j++){
// char => string => int
maze[i][j] = Integer.parseInt(Character.toString(line.charAt(j)));
}
}
// 방문처리
int[][] dist = new int[n][m];
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
dist[i][j] = -1;
}
}
// 큐 => 시작 지점 넣고 => 시작 지점 0으로 방문 처리
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[]{0, 0});
dist[0][0] = 1;
while (!queue.isEmpty()) {
int[] current = queue.poll();
int x = current[1];
int y = current[0];
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < m && ny >= 0 && ny < n && maze[ny][nx] == 1 && dist[ny][nx] == -1) {
queue.offer(new int[]{ny, nx});
dist[ny][nx] = dist[y][x] + 1;
}
}
}
System.out.println(dist[n-1][m-1]);
}
}
해당 코드는 주어진 미로에서 출발점(0, 0)부터 도착점(n-1, m-1)까지의 최단 경로 길이를 찾는 BFS(Breadth-First Search) 알고리즘을 사용합니다. BFS는 너비 우선 탐색 방식으로, 인접한 정점들을 우선적으로 탐색하는 알고리즘입니다.
코드 설명:
이 코드는 큐를 사용하여 BFS를 구현하고, 상하좌우로 인접한 위치를 탐색하면서 최단 경로를 찾아나갑니다. dist 배열은 방문 여부와 최단 경로 길이를 저장하기 위해 사용되며, 방문한 위치는 dist 배열의 해당 위치에 최단 경로 길이를 저장하고 방문 여부를 표시합니다.
BFS는 너비를 우선으로 탐색하기 때문에, 출발점에서 도착점으로의 경로 중 가장 짧은 경로를 찾아줍니다. 이를 통해 주어진 미로에서 출발점부터 도착점까지의 최단 경로 길이를 구할 수 있습니다.
const readline = require("readline");
let n, m;
const maze = [];
let dist;
const input = [];
readline
.createInterface(process.stdin, process.stdout)
.on("line", (line) => {
input.push(line);
})
.on("close", () => {
const [nmLine, ...mazeLines] = input;
[n, m] = nmLine.split(" ").map(Number);
dist = new Array(n).fill(null).map(() => new Array(m).fill(-1));
for (let i = 0; i < n; i++) {
maze.push(mazeLines[i].split("").map(Number));
}
const result = solveMaze(n, m, maze, dist);
console.log(result);
process.exit();
});
const dx = [-1, 1, 0, 0];
const dy = [0, 0, -1, 1];
function solveMaze(n, m, maze, dist) {
const queue = [];
queue.push([0, 0]);
dist[0][0] = 1;
while (queue.length > 0) {
const [y, x] = queue.shift();
for (let i = 0; i < 4; i++) {
const ny = dy[i] + y;
const nx = dx[i] + x;
if (
ny >= 0 &&
ny < n &&
nx >= 0 &&
nx < m &&
dist[ny][nx] === -1 &&
maze[ny][nx] === 1
) {
queue.push([ny, nx]);
dist[ny][nx] = dist[y][x] + 1;
}
}
}
return dist[n - 1][m - 1];
}
from collections import deque
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def solveMaze(n, m, maze):
dist = [[-1] * m for _ in range(n)]
dist[0][0] = 1
queue = deque()
queue.append((0, 0))
while queue:
y, x = queue.popleft()
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if 0 <= ny < n and 0 <= nx < m and maze[ny][nx] == 1 and dist[ny][nx] == -1:
queue.append((ny, nx))
dist[ny][nx] = dist[y][x] + 1
return dist[n - 1][m - 1]
n, m = map(int, input().split())
maze = []
for _ in range(n):
line = list(map(int, input().strip()))
maze.append(line)
result = solveMaze(n, m, maze)
print(result)