#include <bits/stdc++.h>
using namespace std;
struct init {
  init() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
  }
} init_;
int main() {
  int h, w, k;
  cin >> h >> w >> k;
  vector<vector<char>> grid(h, vector<char>(w));
  int si, sj;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cin >> grid[i][j];
      if (grid[i][j] == 'S') {
        si = i;
        sj = j;
      }
    }
  }
  using type = pair<int, pair<int, int>>;
  priority_queue<type, vector<type>, greater<type>> pq;
  vector<vector<int>> cost(h, vector<int>(w, 1e9));
  pq.emplace(0, make_pair(si, sj));
  while (!pq.empty()) {
    auto [c, xy] = pq.top();
    auto [x, y] = xy;
    pq.pop();
    if (cost[x][y] <= c) continue;
    ((void)0);
    cost[x][y] = c;
    vector<int> dx{1, -1, 0, 0};
    vector<int> dy{0, 0, 1, -1};
    for (int i = 0; i < 4; i++) {
      int nx = x + dx[i], ny = y + dy[i];
      if (nx < 0 || nx >= h || ny < 0 || ny >= w) continue;
      if (cost[nx][ny] <= c) continue;
      if (grid[x][y] == 'S' || grid[x][y] != grid[nx][ny]) {
        pq.emplace((c / k + 1) * k, make_pair(nx, ny));
      } else
        pq.emplace(c + 1, make_pair(nx, ny));
    }
  }
  ((void)0);
  int ans = 1e9;
  for (int i = 0; i < h; i++) {
    ans = min(ans, (cost[i][0] + 1) / k + (grid[i][0] == '#'));
    ans = min(ans, (cost[i][w - 1] + 1) / k + (grid[i][w - 1] == '#'));
  }
  for (int j = 0; j < w; j++) {
    ans = min(ans, (cost[0][j] + 1) / k + (grid[0][j] == '#'));
    ans = min(ans, (cost[h - 1][j] + 1) / k + (grid[h - 1][j] == '#'));
  }
  cout << ans << endl;
}
