import java.util.*

data class State(val r: Int, val c: Int, val d: Int)

fun main(args: Array<String>) {
  val (h, w, k) = readLine()!!.split(" ").map { it.toInt() }
  val board = Array(h, { readLine()!! })

  val visited = Array(h, { BooleanArray(w) })

  val queue = ArrayDeque<State>()

  for (r in 0 until h) {
    for (c in 0 until w) {
      if (board[r][c] == 'S') {
        visited[r][c] = true
        queue.offerLast(State(r, c, 0))
      }
    }
  }

  var firstTurnExit = false
  while (queue.isNotEmpty()) {
    val state = queue.pollFirst()
    val r = state.r
    val c = state.c
    if (r == 0 || r == h - 1 || c == 0 || c == w - 1) {
      firstTurnExit = true
      break
    }

    if (state.d == k) continue

    fun mayVisit(nr: Int, nc: Int) {
      if (visited[nr][nc]) return
      if (board[nr][nc] == '#') return
      visited[nr][nc] = true
      queue.offerLast(State(nr, nc, state.d + 1))
    }

    mayVisit(r - 1, c)
    mayVisit(r + 1, c)
    mayVisit(r, c - 1)
    mayVisit(r, c + 1)
  }

  if (firstTurnExit) {
    println(1)
    return
  }

  var ans = Int.MAX_VALUE
  for (r in 0 until h) {
    for (c in 0 until w) {
      if (visited[r][c]) {
        var minDistance = Int.MAX_VALUE
        minDistance = Math.min(minDistance, r)
        minDistance = Math.min(minDistance, c)
        minDistance = Math.min(minDistance, h - 1 - r)
        minDistance = Math.min(minDistance, w - 1 - c)
        val turn = (minDistance + k - 1) / k + 1
        ans = Math.min(ans, turn)
      }
    }
  }
  println(ans)
}
