#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

#include "../../library/library/debug_template.cpp"

using namespace std;

#ifdef _DEBUG
#include "../../library/library/debug_template.cpp"
#define DMP(...) dump(#__VA_ARGS__, __VA_ARGS__)
#else
#define DMP(...) ((void)0)
#endif

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;
        DMP(c, xy);
        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));
        }
    }

    DMP(cost);

    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;
}
