// Slower C++ solution:
#include <iostream>

#include <fstream>

#include <cstdio>

#include <algorithm>

#include <string>

#include <vector>

#include <queue>

#include <deque>

#include <utility>

#include <map>

#include <set>

#include <cmath>

#include <cstdlib>

#include <ctime>

#include <functional>

#include <sstream>

#include <cstring>

#include <bitset>

#include <stack>

using namespace std;

#define MP make_pair

#define PB push_back

const int INF=1e9;



int n,m,k,sx,sy,ans;

char c[805][805];

int dist[805][805];

int mx[]={0,0,1,0,-1};

int my[]={0,1,0,-1,0};



inline void bfs(int X,int Y)

{

	queue <int> q;

	q.push(X);q.push(Y);

	memset(dist,-1,sizeof(dist));

	dist[X][Y]=0;

	while (!q.empty())

	{

		int x=q.front();q.pop();

		int y=q.front();q.pop();

		for (int i=1;i<=4;i++)

		{

			int tx=x+mx[i];

			int ty=y+my[i];

			if (tx<1 || tx>n || ty<1 || ty>m || dist[tx][ty]!=-1 || c[tx][ty]!='.') continue;

			dist[tx][ty]=dist[x][y]+1;

			q.push(tx);

			q.push(ty);

		}

	} 

}



int main()

{

	cin>>n>>m>>k;

	for (int i=1;i<=n;i++) scanf("%s",c[i]+1);

	for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (c[i][j]=='S') {sx=i;sy=j;break;}

	bfs(sx,sy);

	ans=INF;

	for (int i=1;i<=n;i++)

		for (int j=1;j<=m;j++)

			if (dist[i][j]<=k && dist[i][j]!=-1)

			{

		//		cout<<i<<" "<<j<<endl;

				int res=min(i-1,n-i);

				res=min(res,min(j-1,m-j));

				ans=min(ans,res);

			}

	cout<<1+(ans+k-1)/k;

	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 3.6116353703092585x):
#include <cstdio>

#include <iostream>

#include <cstring>

#include <string>

#include <cmath>

#include <algorithm>

#include <cstdlib>

#include <utility>

#include <map>

#include <stack>

#include <set>

#include <vector>

#include <queue>

#include <deque>

#include <sstream>

#include <bitset> 

#define x first

#define y second

#define mp make_pair

#define pb push_back

#define LL long long

#define ld long double

#define Pair pair<int,int>

#define LOWBIT(x) x & (-x)

using namespace std;



const int INF=0x7ffffff;



int ans=INF;

int movee[5][3];

bool visited[848][848];

int r,c,k;

int sx,sy;

int a[848][848];

char s[1000];

queue<int> q;



void bfs(int x,int y,int step)

{

	q.push(x);q.push(y);q.push(0);

	int cur_ans,cx,cy,cd,xx,yy,dd;

	visited[x][y]=true;

	while (!q.empty())

	{

		cx=q.front();q.pop();

		cy=q.front();q.pop();

		cd=q.front();q.pop();

		//visited[cx][cy]=true;

		cur_ans=cx-1;

		cur_ans=min(cur_ans,cy-1);

		cur_ans=min(cur_ans,r-cx);

		cur_ans=min(cur_ans,c-cy);

		ans=min(ans,cur_ans);

		if (cd==k) continue;

		for (int i=1;i<=4;i++)

		{

			xx=cx+movee[i][1];yy=cy+movee[i][2];

			if (xx<1 || xx>r || yy<1 || yy>c) continue;

			if (a[xx][yy]==1 || visited[xx][yy]) continue;

			visited[xx][yy]=true;q.push(xx);q.push(yy);q.push(cd+1);

		}

	}

	/*int cur_ans=x-1;

	cur_ans=min(cur_ans,y-1);

	cur_ans=min(cur_ans,r-x);

	cur_ans=min(cur_ans,c-y);

	ans=min(ans,cur_ans);

	visited[x][y]=true;

	if (step==k) return;

	int xx,yy,i;

	for (i=1;i<=4;i++)

	{

		xx=x+movee[i][1];yy=y+movee[i][2];

		if (xx<1 || xx>r || yy<1 || yy>c) continue;

		if (a[xx][yy]==1 || visited[xx][yy]) continue;

		dfs(xx,yy,step+1);

	}*/

}



int main ()

{

	//ios::sync_with_stdio(false);

	int i,j;

	movee[1][1]=1;movee[1][2]=0;

	movee[2][1]=0;movee[2][2]=1;

	movee[3][1]=-1;movee[3][2]=0;

	movee[4][1]=0;movee[4][2]=-1;

	scanf("%d%d%d",&r,&c,&k);

	for (i=1;i<=r;i++)

	{

		scanf("%s",s);

		for (j=1;j<=c;j++)

		{

			if (s[j-1]=='#') a[i][j]=1;

			if (s[j-1]=='.') a[i][j]=2;

			if (s[j-1]=='S')

			{

				sx=i;sy=j;

				a[i][j]=2;

			}

		}

	}

	bfs(sx,sy,0);

	int fans=1+(ans+k-1)/k;

	printf("%d\n",fans);

	return 0;

}



/*

3 3 3

#.#

#S.

###



3 3 3

###

#S#

###



7 7 2

#######

#######

##...##

###S###

##.#.##

###.###

#######

*/