https://coderun.yandex.ru/problem/speleologist-way Легкая

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.util.LinkedList
import java.util.Queue

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))
    
    val n = reader.readLine().trim().toInt()
    
    val cave = Array(n) { Array(n) { CharArray(n) } }
    var startZ = -1
    var startX = -1
    var startY = -1
    
    for (z in 0 until n) {
        var line: String?
        do {
            line = reader.readLine()
        } while (line != null && line.isBlank())
        cave[z][0] = line.toCharArray()
        if (line.contains('S')) {
            startZ = z
            startX = 0
            startY = line.indexOf('S')
        }
        for (x in 1 until n) {
            val row = reader.readLine().trim()
            cave[z][x] = row.toCharArray()
            if (row.contains('S')) {
                startZ = z
                startX = x
                startY = row.indexOf('S')
            }
        }
    }
    
    if (startZ == 0) {
        writer.write("0")
        writer.flush()
        return
    }
    
    val dist = Array(n) { Array(n) { IntArray(n) { -1 } } }
    
    val queue: Queue<Triple<Int, Int, Int>> = LinkedList()
    
    dist[startZ][startX][startY] = 0
    queue.add(Triple(startZ, startX, startY))
    
    val directions = arrayOf(
        Triple(-1, 0, 0),
        Triple(1, 0, 0),
        Triple(0, -1, 0),
        Triple(0, 1, 0),
        Triple(0, 0, -1),
        Triple(0, 0, 1)
    )
    
    while (queue.isNotEmpty()) {
        val (z, x, y) = queue.poll()
        
        if (z == 0) {
            writer.write(dist[z][x][y].toString())
            writer.flush()
            return
        }
        
        for ((dz, dx, dy) in directions) {
            val nz = z + dz
            val nx = x + dx
            val ny = y + dy
            
            if (nz in 0 until n && nx in 0 until n && ny in 0 until n) {
                if (cave[nz][nx][ny] != '#' && dist[nz][nx][ny] == -1) {
                    dist[nz][nx][ny] = dist[z][x][y] + 1
                    queue.add(Triple(nz, nx, ny))
                }
            }
        }
    }
    
    writer.flush()
    writer.close()
}