// May this submission get accepted!

#pragma GCC optimize ("O3")
#pragma GCC target ("tune=native")
#pragma GCC target ("avx")

#include <bits/stdc++.h>

// 汎用マクロ
#define ALL_OF(x) (x).begin(), (x).end()
#define REP(i,n) for (long long i=0, i##_len=(n); i<i##_len; i++)
#define RANGE(i,is,ie) for (long long i=(is), i##_end=(ie); i<=i##_end; i++)
#define DSRNG(i,is,ie) for (long long i=(is), i##_end=(ie); i>=i##_end; i--)
#define UNIQUE(v) do { sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end()); } while (false)
template<class T> bool chmax(T &a, const T &b) {if (a < b) {a = b; return true;} return false; }
template<class T> bool chmin(T &a, const T &b) {if (a > b) {a = b; return true;} return false; }
#define INF 0x7FFFFFFF
#define LINF 0x7FFFFFFFFFFFFFFFLL
#define Yes(q) ((q) ? "Yes" : "No")
#define YES(q) ((q) ? "YES" : "NO")
#define Possible(q) ((q) ? "Possible" : "Impossible")
#define POSSIBLE(q) ((q) ? "POSSIBLE" : "IMPOSSIBLE")
#define DUMP(q) cerr << "[DEBUG] " #q ": " << (q) << " at " __FILE__ ":" << __LINE__ << endl
#define DUMPALL(q) do { cerr << "[DEBUG] " #q ": ["; REP(i, (q).size()) { cerr << (q)[i] << (i == i_len-1 ? "" : ", "); } cerr << "] at " __FILE__ ":" << __LINE__ << endl; } while (false)
template<class T> T gcd(const T &a, const T &b) { return a < b ? gcd(b, a) : b ? gcd(b, a % b) : a; }
template<class T> T lcm(const T &a, const T &b) { return a / gcd(a, b) * b; }

// gcc拡張マクロ
#define popcount __builtin_popcount
#define popcountll __builtin_popcountll

// エイリアス
#define DANCE_ long
#define ROBOT_ unsigned
#define HUMAN_ signed
#define CHOKUDAI_ const
using  ll = DANCE_ HUMAN_ DANCE_;
using ull = DANCE_ ROBOT_ DANCE_;
using cll = DANCE_ DANCE_ CHOKUDAI_;
using  ld = long double;
using namespace std;

// モジュール


// 処理内容
int main() {
    
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    ll h, w, k; cin >> h >> w >> k;
    vector<string> a(h);
    REP(i, h) cin >> a[i];

    ll si, sj;
    REP(i, h) {
        REP(j, w) {
            if (a[i][j] == 'S') {
                si = i;
                sj = j;
            }
        }
    }

    vector<vector<ll>> d(h, vector<ll>(w, INF));
    using pl4 = pair<ll, ll>;
    using tl6 = tuple<ll, ll, ll>;
    auto comp = [&](tl6 i, tl6 j) -> bool {
        return get<2>(i) > get<2>(j);
    };
    priority_queue<tl6, vector<tl6>, decltype(comp)> q(comp);

    d[si][sj] = 0;
    q.push(tl6(si, sj, 0));

    vector<pl4> dx = {
        {-1,  0},
        {+1,  0},
        { 0, -1},
        { 0, +1}
    };

    while (q.size()) {

        ll i = get<0>(q.top());
        ll j = get<1>(q.top());
        ll dij = get<2>(q.top());
        q.pop();
        if (dij != d[i][j]) continue;

        vector<pl4> kimbo; kimbo.reserve(4);
        for (pl4 &v : dx) {
            ll i2 = i + v.first;
            ll j2 = j + v.second;
            if (0 <= i2 && i2 < h && 0 <= j2 && j2 < w) {
                kimbo.emplace_back(i2, j2);
            }
        }

        for (pair<ll, ll> &u : kimbo) {
            ll i2 = u.first;
            ll j2 = u.second;
            ll cand;
            if ((a[i2][j2] == '#') == (a[i][j] == '#')) {
                cand = d[i][j] + 1;
            } else if (a[i][j] != '#') {
                if (d[i][j] < k) {
                    cand = (d[i][j] / k + 1) * k + 1;
                } else {
                    cand = d[i][j] + 1;
                }
            }
            if (chmin(d[i2][j2], cand)) {
                q.push(tl6(i2, j2, cand));
            }
        }

    }

    cerr << "\n";
    REP(i, h) REP(j, w) {
        cerr << setw(5) << d[i][j] << " \n"[j==w-1];
    }
    cerr << "\n";

    ll ans = INF;
    REP(i, h) {
        chmin(ans, d[i][0]);
        chmin(ans, d[i][w-1]);
    }
    REP(j, w) {
        chmin(ans, d[0][j]);
        chmin(ans, d[h-1][j]);
    }
    cout << (ans + k - 1) / k << endl;
    
}


Measured memory_bytes: 14200