시배's Android

Algorithm | 백준 Kotlin 7576 토마토 본문

Algorithm

Algorithm | 백준 Kotlin 7576 토마토

si8ae 2023. 10. 7. 22:32
 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

 

import java.util.*

private fun main() {
    val r = System.`in`.bufferedReader()
    val queue: Queue<Triple<Int, Int, Int>> = LinkedList()

    val (n, m) = r.readLine().split(' ').map { it.toInt() }
    val arr = Array(m) { IntArray(n) }

    for (y in 0 until m) with(StringTokenizer(r.readLine())) {
        for (x in 0 until n) {
            val num = nextToken().toInt()
            if (num == 1) queue += Triple(x, y, 0)
            arr[y][x] = num - 1
        }
    }

    val dx = intArrayOf(-1, 1, 0, 0)
    val dy = intArrayOf(0, 0, -1, 1)

    while (queue.isNotEmpty()) {
        val (x, y, t) = queue.poll()

        for (i in 0 until 4) {
            val nx = x + dx[i]
            val ny = y + dy[i]
            if (nx !in 0 until n || ny !in 0 until m) continue
            if (arr[ny][nx] != -1) continue

            arr[ny][nx] = t + 1
            queue += Triple(nx, ny, t + 1)
        }
    }

    var t = 0

    for (row in arr) {
        for (col in row) {
            if (col == -1) t = -1
            if (t != -1 && col > t) t = col
        }
    }

    println(t)
}