#include <bits/stdc++.h>

#define int long long
#define double long double

using namespace std;

template<class T> string tostr(T x) { stringstream o; o << x; return o.str(); }
template<class T> T sqr(T x) { return x*x; }
template<class T> T mypow(T x, int n) { T r = 1; while (n > 0) { if (n & 1)r = r*x; x = x*x; n >>= 1; }return r; }

int toint(string s) { int v; stringstream i(s); i >> v; return v; }
bool check(int x, int y, int w, int h) { return x >= 0 && y >= 0 && w > x && h > y; }
int gcd(int a, int b) { return b ? gcd(b, a%b) : a; }
int lcm(int a, int b) { return a / gcd(a, b) * b; }

#define REP(i,a,b)	for(int (i) = (a);i < (b);(i)++)
#define rep(i,n)	REP(i,0,n)
#define PER(i,a,b)	for(int (i) = (a-1);i >= (b);(i)--)
#define per(i,n)	PER(i,n,0)
#define each(i,n)	for(auto &i : n)
#define clr(a)		memset((a), 0 ,sizeof(a))
#define mclr(a)		memset((a), -1 ,sizeof(a))
#define all(a)		(a).begin(),(a).end()
#define dump(val) 	cerr << #val " = " << val << endl;
#define dum(val)	cerr << #val " = " << val;
#define FILL(a,v)	fill(a,a+sizeof(a)/sizeof(*a),v)

const int dx[8] = { +1,+0,-1,+0,+1,+1,-1,-1 };
const int dy[8] = { +0,-1,+0,+1,-1,+1,-1,+1 };
const int mod = 1e9 + 7;
const int INF = 1e9;

typedef tuple<int,int,int,int> F;
int vis[801][801];

signed main() {

	int h, w, k;
	cin >> h >> w >> k;

	int sy, sx;

	vector<string> s(h);
	rep(y, h){
		cin >> s[y];
		rep(x, w){
			if(s[y][x] == 'S'){
				sy = y;sx = x;
			}
		}
	}

		
	auto ok = [&](int m){
		vector<string> t = s;
		clr(vis);

		queue<F> q;
		q.push(F(sy, sx, 0, 0));
		rep(i, w)rep(j, h){
			vis[j][i] = INF;
		}
		vis[sy][sx] = 0

		while(q.size()){
			auto now = q.front();
			q.pop();

			int y = get<0>(now);
			int x = get<1>(now);
			int mv = get<2>(now);
			int us = get<3>(now);

			if(mv > m * k)continue;
			if(mv && mv % k == 0) us += k;
			if(x == 0 || y == 0 || x == w - 1 || y == h - 1){
				return true;
			}

			rep(i, 4){
				int tx = x + dx[i], ty = y + dy[i];
				if(check(tx, ty, w, h) && vis[ty][tx] > mv + 1){
					if(s[ty][tx] == '#'){
						if(us){
							q.push(F(ty, tx, mv + 1, us - 1));
						}else continue;
					}else{
						q.push(F(ty, tx, mv + 1, us));
					}
					vis[ty][tx] = mv + 1;
				}
			}

			bool ok = false;
			rep(i, 4){
				int tx = x + dx[i], ty = y + dy[i];
				if(check(tx, ty, w, h) && vis[ty][tx] > (mv / k + 1) * k + 1){
					ok = true;
				}
			}
			if(ok){
				q.push(F(y, x, (mv / k + 1) * k , us));
			}

		}

		return false;
	};

	int l = 0, r = INF;
	rep(i, 100) {
		int m = (r + l) / 2.0;
		if (ok(m)) {
			r = m;
		}
		else {
			l = m;
		}
	}

	cout << r << endl;

	return 0;
}
