#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <map>
#include <algorithm>
#include <iomanip>
#include <math.h>
#include <string.h>
#include <cstdio>
#include <tuple>
using namespace std; using ll = long long; using ld = long double;  using pll = pair<ll, ll>;
using vl = vector<ll>; using vll = vector<vl>; using vpll = vector<pll>;
const ld PI = 3.1415926535897932;
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#define rep1(n) for(ll i=0;i<n;++i)
#define rep2(i,n) for(ll i=0;i<n;++i)
#define rep3(i,a,b) for(ll i=a;i<b;++i)
#define rep4(i,a,b,c) for(ll i=a;i<b;i+=c)
#define rep(...) overload4(__VA_ARGS__,rep4,rep3,rep2,rep1)(__VA_ARGS__)
#define mp make_pair
#define mt make_tuple
#define INT(...) int __VA_ARGS__;in(__VA_ARGS__)
#define LL(...) ll __VA_ARGS__;in(__VA_ARGS__)
#define ULL(...) ull __VA_ARGS__;in(__VA_ARGS__)
#define STR(...) string __VA_ARGS__;in(__VA_ARGS__)
#define CHR(...) char __VA_ARGS__;in(__VA_ARGS__)
#define DBL(...) double __VA_ARGS__;in(__VA_ARGS__)
#define LD(...) ld __VA_ARGS__;in(__VA_ARGS__)
void in() {}
void debug_out() { cerr << endl; }
template<typename Head, typename... Tail>
void debug_out(Head h, Tail... t) {
	cerr << " " << h;
	if (sizeof...(t) > 0) cerr << " :";
	debug_out(t...);
}
template <typename T>
ostream& operator<<(ostream& os, vector<T> vec) {
	for (size_t i = 0; i < vec.size(); i++)os << vec[i] << (i + 1 == vec.size() ? "" : " ");
	return os;
}
ll ctoi(char c) {
	switch (c) {
	case '0': return 0; case '1': return 1; case '2': return 2;
	case '3': return 3; case '4': return 4; case '5': return 5;
	case '6': return 6; case '7': return 7; case '8': return 8;
	case '9': return 9;  default: return 0;
	}
}
bool pairCompare(const pll firstElof, pll secondElof)
{
	return firstElof.first > secondElof.first;
}
//**Snippetリスト**//
//rep, vin, all, iteLoop, bitSearch, bitList, nod//
//gcdlcm, isPrime, eratos, primeFactorize, Npow, combination, divisor, modinv,  digitDP//
//dfs, bfs, dijkstra, WarshallFloyd, BellmanFord, UnionFind, Kruskal ,RMQ, LCA//
ll i, j, k, l; ll N, M, K, H, W, L, X, Y, Z, R, Q;
ll MOD = 1000000007; ll INF = 1LL << 60; ll ans = 0; ll z = 0, o = 1;
vl flag; vll D; vll path; vector<string> A; ll magic = 0; vpll list;
//***********//
void bfs(ll h,ll w,ll count) {
	queue < tuple < ll, ll, ll >> Q;
	Q.push(mt(h,w,0));
	D[h][w] = 1;
	tuple<ll,ll,ll> u;
	while (!Q.empty()) {
		u = Q.front();
		Q.pop();
		ll p = get<0>(u);
		ll q = get<1>(u);
		ll c = get<2>(u);
		//debug(p, q, c,ans);
		list.push_back(mp(p, q));
		if (p == 0 || p == H - 1 || q == 0 || q == W - 1) {
			cout << 1 << endl;
			exit(0);
		}
		else if (c<K) {
			ll np, nq;
			np = p + 1; nq = q;
			if ((ans>1 || A[np][nq]=='.') && !D[np][nq]) {
				Q.push(mt(np, nq, c+1)); D[np][nq] = 1;
			}
			np = p - 1; nq = q;
			if ((ans > 1 || A[np][nq] == '.') && !D[np][nq]) {
				Q.push(mt(np, nq, c+1)); D[np][nq] = 1;
			}
			np = p; nq = q+1;
			if ((ans > 1 || A[np][nq] == '.') && !D[np][nq]) {
				Q.push(mt(np, nq, c+1)); D[np][nq] = 1;
			}
			np = p; nq = q-1;
			if ((ans > 1 || A[np][nq] == '.') && !D[np][nq]) {
				Q.push(mt(np, nq, c+1)); D[np][nq] = 1;
			}
		}
	}
}
int main() {
	cin >> H >> W >> K;
	A.resize(H);
	D.resize(H);
	ll sh = 0, sw = 0;
	for (i = 0; i < H; i++) {
		cin >> A[i];
		for (j = 0; j < W; j++) {
			D[i].push_back(0);
			if (A[i][j] == 'S') {
				sh = i; sw = j;
			}
		}
	}
	bfs(sh, sw, 0);
	ans = INF;
	for (k = 0; k < list.size(); k++) {
		ll p = list[k].first;
		ll q = list[k].second;
		//debug(list[k].first,list[k].second);
		for (i = 0; i < H; i++) {
			ans = min(ans, 1 + (abs(p - i) + abs(q - 0) - 1) / K + 1);
			ans = min(ans, 1 + (abs(p - i) + abs(q - (W-1)) - 1) / K + 1);
		}
		for (i = 0; i < W; i++) {
			ans = min(ans, 1 + (abs(p - 0) + abs(q - i) - 1) / K + 1);
			ans = min(ans, 1 + (abs(p - (H-1)) + abs(q - i) - 1) / K + 1);
		}
	}
	cout << ans << endl;
}

Measured memory_bytes: 8964