#include <bits/stdc++.h>
using namespace std;
//define
#define int long long
#define UNIQUE(v) v.erase(unique(all(v)), v.end());
#define ZIP(v) sort(all(v)),UNIQUE(v)
#define ADD(a, b) a = (a + b) % mod
#define SUB(a, b) a = (a+mod-b)%mod
#define MUL(a, b) a = (a * b) % mod
#define repi(i,m,n) for(int i = m;i < n;i++)
#define drep(i,n,m) for(int i = n;i >= m;i--)
#define rep(i,n) repi(i,0,n)
#define rrep(i,n) repi(i,1,n+1)
#define chmin(x,y) x = min(x,y)
#define chmax(x,y) x = max(x,y)
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(), v.rend()
#define dmp(x,y) make_pair(x,y)
#define pb(x) push_back(x)
#define pf(x) push_front(x)
#define fi first
#define se second
// 許容する誤差ε
#define EPS (1e-10)
// 2つのスカラーが等しいかどうか
#define EQ(a,b) (abs((a)-(b)) < EPS)
// 2つのベクトルが等しいかどうか
#define EQV(a,b) ( EQ((a).real(), (b).real()) && EQ((a).imag(), (b).imag()) )
//template
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p){
  os << "(" << p.first << "," << p.second << ")";return os;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &v){
  for (auto it = v.begin();it != v.end();++it){
    if(it != v.begin())os << " ";os << *it;
      }return os;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const map<T, U> &mp){
  for(auto x: mp)os << "(" << x.first << "," << x.second << ")" << endl;
  return os;
}
template<typename T, int SIZE>
int array_length(const T (&)[SIZE]){return SIZE;}
template<typename T, int N>
void PRINTF(const T (&a)[N], int s = N, int t = -1, bool f = true){
	if(t == -1){rep(i,s){if(i)cout << " ";cout << a[i];}}
	else repi(i,s,t){if(i!=s)cout << " ";cout << a[i];}
	if(f)cout << "\n";
}
template<typename T, int N1, int N2>
void PRINTF(const T (&a)[N1][N2], int h = N1, int w = N2){
	rep(i,h){rep(j,w){cout << a[i][j] << " \n"[j==w-1];}}
}
//typedef
typedef complex<double> Point;
typedef pair<int,int> P;
typedef pair<int, P> PP;
typedef pair<P, int> Pi;
typedef vector<int> vi;
typedef deque<int> dq;
const int inf = 1e9+7;
const int INF = 1e18+7;



string str[1000];
bool used[1000*1000];
int dy[] = {-1, 0, 0, 1}, dx[] = {0,-1, 1, 0};
int h, w, k;
bool ok(int y, int x){
  if(y == 0 or y == h-1)return false;
  if(x == 0 or x == w-1)return false;
  return true;
}
int distance(P p){
  int y = p.fi, x = p.se;
  int yy = min(y, (h-1)-y);
  int xx = min(x, (w-1)-x);
  return min(yy, xx);
}
signed main(){
  scanf("%lld%lld%lld", &h, &w, &k);
  rep(i,h){cin >> str[i];}
  P s;
  rep(i,h)rep(j,w)if(str[i][j] == 'S')s = P(i, j);
  
  queue<PP> q;
  q.push(PP(0, s));
  used[s.fi*w+s.se] = true;
  rep(i,h+w){
    int ans = 0;
  
    int mn = INF;
    while(!q.empty()){
      if(q.front().fi == k)break;
      PP p = q.front();q.pop();
      // cout << p.se << endl;
      if(ok(p.se.fi, p.se.se) == false)break;
      rep(j,4){
        int yy = p.se.fi+dy[j], xx = p.se.se+dx[j];
        if(str[yy][xx] == '#' and i == 0 or used[yy*w+xx])continue;
        if(ok(yy, xx) == false)ans = 1;
        q.push(PP(p.fi+1, P(yy, xx)));
        mn = min(mn, distance(P(yy, xx)));
        used[yy*w+xx] = true;
      }
    }
  
    if(ans){printf("%lld\n", i+1);return 0;}
    q.push(PP(0, s));
    while(!q.empty()){
      PP p = q.front();q.pop();
      mn = min(mn, distance(p.se));
    }
    printf("%lld\n", 1+(mn+k-1)/k);
    break;
  }
	return 0;
}









Measured memory_bytes: 1408