#include <bits/stdc++.h>
using namespace std;
const int N = 805;
int h, w, k;
char grid[N][N];
bool vis[N][N];
bool lock_h(int l, int r, int x) {
  for (int i = l; i <= r; i++) {
    if (grid[x][i] == '#') return true;
  }
  return false;
}
bool lock_v(int u, int d, int y) {
  for (int i = u; i <= d; i++) {
    if (grid[i][y] == '#') return true;
  }
  return false;
}
int foo(int x, int y) {
  if (x == 0 || x == h - 1 || y == 0 || y == w - 1) return 0;
  int res = 0x3f3f3f3f;
  int tmp = (x - 1) / k + 1;
  if (lock_v(x - (((x - 1) % k) + 1), x - 1, y)) tmp++;
  res = min(res, tmp);
  int xx = h - 1 - x;
  tmp = (xx - 1) / k + 1;
  if (lock_v(x + 1, x + ((xx - 1) % k) + 1, y)) tmp++;
  res = min(res, tmp);
  tmp = (y - 1) / k + 1;
  if (lock_h(y - (((y - 1) % k) + 1), y - 1, x)) tmp++;
  res = min(res, tmp);
  int yy = w - 1 - y;
  tmp = (yy - 1) / k + 1;
  if (lock_h(y + 1, y + ((yy - 1) % k) + 1, x)) tmp++;
  res = min(res, tmp);
  return res;
}
int ans = 0x3f3f3f3f;
struct node {
  int x, y, dis;
};
void bfs(int x, int y, int dis) {
  vis[x][y] = true;
  ans = min(ans, foo(x, y));
  queue<node> q;
  q.push({x, y, 0});
  while (!q.empty()) {
    node cur = q.front();
    q.pop();
    if (vis[cur.x][cur.y]) continue;
    vis[cur.x][cur.y] = 1;
    if (cur.dis > 0) ans = min(ans, foo(cur.x, cur.y));
    for (int i = -1; i <= 1; i++) {
      for (int j = -1; j <= 1; j++) {
        if ((i == 0 && j == 0) || (i != 0 && j != 0)) continue;
        int xx = x + i;
        int yy = y + j;
        if (xx > 0 && xx < h && yy > 0 && yy < h && !vis[xx][yy] &&
            grid[xx][yy] != '#' && cur.dis < dis) {
          q.push({xx, yy, cur.dis + 1});
        }
      }
    }
  }
}
int main() {
  scanf("%d%d%d", &h, &w, &k);
  for (int i = 0; i < h; i++) {
    scanf("%s", grid[i]);
  }
  int sx, sy;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (grid[i][j] == 'S') {
        sx = i;
        sy = j;
        break;
      }
    }
  }
  bfs(sx, sy, 0);
  printf("%d\n", ans);
}
