#include <iostream>
#include <iomanip>
#include <random>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <numeric>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <sstream>
#include <bitset>
#include <cassert>
#include <fstream>
#include <queue>

#define len(X) ((int)(X).size())

#ifdef __LOCAL
	#define DBG(X) cout << #X << "=" << (X) << '\n';
	#define SAY(X) cout << (X) << '\n';
#else
	#define DBG(X)
	#define SAY(X)
#endif
 
using namespace std;

using ll = long long int;
using ull = unsigned long long int;
using ld  = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

const int INT_INF = (int)(2e9);
const ll  LL_INF  = (ll)(2e18);

const int NIL = -1;
static mt19937 _g(time(nullptr));

inline ll randint(ll a, ll b) { ll w = (_g() << 31LL) ^ _g(); return a + w % (b - a + 1); }
inline void fast_io() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); };
template<typename T> inline T sign(T x) { return T(x > 0) - T(x < 0); }
template<typename T, typename S> inline ostream& operator<<(ostream& os, const pair<T, S> p) { cout << "[" << p.first << ";" << p.second << "]"; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const vector<T>& v) { for(auto el: v) cout << el << " "; return os; }
template<typename T> inline T fetch() { T ret; cin >> ret; return ret; }
template<typename T> inline vector<T> fetch_vec(int sz) { vector<T> ret(sz); for(auto& elem: ret) cin >> elem; return ret; }

const int MAXN = 807;
char A[MAXN][MAXN];
int H, W, K;

const int DIRS = 4;
const int di[] = {0, 0, -1, 1};
const int dj[] = {-1, 1, 0, 0};

int si, sj;
pii Q[MAXN * MAXN];
int dist[MAXN][MAXN];
int head = 0;

int valid(const pii& pt) {
	return (pt.first >= 0 && pt.second >= 0 && pt.first < H && pt.second < W);
}

void clear() {
	head = 0;

	for(int i = 0; i < H; ++i) {
		for(int j = 0; j < W; ++j) {
			dist[i][j] = INT_INF;
		}
	}
}

int find() {
	clear();
	dist[si][sj] = 0;
	Q[head++] = make_pair(si, sj);

	for(int ptr = 0; ptr < head; ++ptr) {
		pii cur = Q[ptr];

		for(int dir = 0; dir < DIRS; ++dir) {
			pii nxt = make_pair(cur.first + di[dir], cur.second + dj[dir]);

			if(valid(nxt) && A[nxt.first][nxt.second] == '.' && dist[nxt.first][nxt.second] > dist[cur.first][cur.second] + 1) {
				dist[nxt.first][nxt.second] = dist[cur.first][cur.second] + 1;
				Q[head++] = nxt;
			}
		}
	}

	head = 0;

	for(int i = 0; i < H; ++i) {
		for(int j = 0; j < W; ++j) {
			if(dist[i][j] > K) {
				dist[i][j] = INT_INF;
			} else {
				dist[i][j] = 0;
				Q[head++] = make_pair(i, j);
			}
		}
	}

	for(int ptr = 0; ptr < head; ++ptr) {
		pii cur = Q[ptr];

		for(int dir = 0; dir < DIRS; ++dir) {
			pii nxt = make_pair(cur.first + di[dir], cur.second + dj[dir]);

			if(valid(nxt) && dist[nxt.first][nxt.second] > dist[cur.first][cur.second] + 1) {
				dist[nxt.first][nxt.second] = dist[cur.first][cur.second] + 1;
				Q[head++] = nxt;
			}
		}
	}

	int rez = INT_INF;

	for(int i = 0; i < H; ++i) {
		for(int j = 0; j < W; ++j) {
			if(i == 0 || j == 0 || i == H - 1 || j == W - 1) {
				rez = min(rez, 1 + (dist[i][j] + K - 1) / K);
			}
		}
	}

	return rez;
}

void solve() {
	cin >> H >> W >> K;

	for(int i = 0; i < H; ++i) {
		auto line = fetch<string>();

		for(int j = 0; j < W; ++j) {
			A[i][j] = line[j];

			if(A[i][j] == 'S') {
				si = i;
				sj = j;
				A[i][j] = '.';
			}
		}
	}

	cout << find() << '\n';
}

int main() {
	fast_io();
	solve();

	return 0;
}


Measured memory_bytes: 8576