Решение
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()
}