2178번: 미로 탐색백준/문제2023. 8. 23. 13:11
Table of Contents
문제 출처 : https://www.acmicpc.net/problem/2178
언어 : Kotlin
문제 설명 :
N×M크기의 배열로 표현되는 미로가 있다.
1 | 0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 1 | 1 |
미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.
위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.
- 첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
- 첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 192MB
입출력 예 :
입력 | 출력 |
4 6 101111 101010 101011 111011 |
15 |
4 6 110110 110110 111111 111101 |
9 |
2 25 1011101110111011101110111 1110111011101110111011101 |
38 |
7 7 1011111 1110001 1000001 1000001 1000001 1000001 1111111 |
13 |
풀이 :
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.util.*
data class Node(val x: Int, val y: Int)
var result = 0
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val bw = BufferedWriter(OutputStreamWriter(System.out))
val (n, m) = br.readLine().split(" ").map { it.toInt() }
val map = Array(n) { Array(m) { 0 } }
repeat(n) { i ->
br.readLine().also {
for (j in it.indices) { if (it[j].digitToInt() == 1) map[i][j] = 1 }
}
}
val dx = intArrayOf(-1, 1, 0, 0)
val dy = intArrayOf(0, 0, -1, 1)
val visited = Array(n) { Array(m) { 1 } }
bfs(n, m, dx, dy, visited, map)
bw.write("$result")
bw.flush()
bw.close()
}
fun bfs(n: Int, m: Int, dx: IntArray, dy: IntArray, visited: Array<Array<Int>>, map: Array<Array<Int>>) {
val queue: Queue<Node> = LinkedList()
queue.offer(Node(0, 0))
visited[0][0] = 1
while (queue.isNotEmpty()) {
val current = queue.poll()
for (i in 0 until 4) {
val nx = current.x + dx[i]
val ny = current.y + dy[i]
if (nx !in 0 until n || ny !in 0 until m || map[nx][ny] == 0 || visited[nx][ny] != 1) continue
queue.offer(Node(nx, ny))
visited[nx][ny] = visited[current.x][current.y] + 1
if (nx == n - 1 && ny == m - 1) { result = visited[nx][ny]; break; }
}
}
}
유사한 문제 :
https://small-stepping.tistory.com/533
https://small-stepping.tistory.com/538
'백준 > 문제' 카테고리의 다른 글
1158번: 요세푸스 문제 (0) | 2023.08.28 |
---|---|
11286번: 절댓값 힙 (0) | 2023.08.24 |
21736번: 헌내기는 친구가 필요 (0) | 2023.08.22 |
11279번: 최대 힙 (0) | 2023.08.21 |
2805번: 나무 자르기 (0) | 2023.08.18 |
@스몰스테핑 :: 작은 발걸음
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!