#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define rep2(i,a,b) for(ll i=(a);i<(b);i++)
#define all(a)  (a).begin(),(a).end()
#define pb emplace_back
#define INF (1e9+1)
//#define INF (1LL<<59)

struct state{ int y,x,dir,bs,s; };

int main(){
    int h,w,a;
    cin>>h>>w>>a;
    vector<string> vs(h);
    rep(i,h)cin>>vs[i];
    
    pii s,g;
    rep(i,h)rep(j,w){
        if(vs[i][j]=='S')s = pii(i,j);
        if(vs[i][j]=='G')g = pii(i,j);
    }
    
    static int dp[101][101][4][11][11];
    rep(i,101)rep(j,101)rep(k,4)rep(l,11)rep(m,11)dp[i][j][k][l][m] = INF;
    dp[s.first][s.second][0][0][0] = 0;
    
    queue<state> que;
    que.push(state{s.first, s.second, 0, 0, 0});
    
    // '\', '/'
    //テ、ツクツ? テ・ツ渉ウ, テ、ツクツ? テ・ツキツヲ
    int dy[]={1,0,-1,0};
    int dx[]={0,1,0,-1};
    
    while(que.size()){
        state q = que.front();
        que.pop();
        
        for(int k = 1;;k++){
            int ddy = q.y+dy[q.dir]*k;
            int ddx = q.x+dx[q.dir]*k;
            
            if( q.dir == 2 && pii(ddy,ddx)==s)break;
            if(pii(ddy,ddx)==s)continue;
            
            if(ddx<0 || ddy<0 || ddx>=w || ddy>=h)break;
            if(vs[ddy][ddx]=='#')break;
            
            int bsnum,snum;
            
            //テヲツ卍づィツィツ暗・ツ崢榲」ツつ甘・ツ崢榲ィツサツ「
            if(q.dir%2==0)  bsnum = 0, snum = 1;
            else            bsnum = 1, snum = 0;
            if( q.bs+bsnum<=a && q.s+snum<=a ){
                if( dp[ddy][ddx][(q.dir+3)%4][q.bs+bsnum][q.s+snum] == INF ){
                    dp[ddy][ddx][(q.dir+3)%4][q.bs+bsnum][q.s+snum] = dp[q.y][q.x][q.dir][q.bs][q.s] + 1;
                    que.push( state{ddy, ddx, (int)(q.dir+3)%4, q.bs+bsnum, q.s+snum} );
                }
            }
            
            //テ・ツ渉催ヲツ卍づィツィツ暗・ツ崢榲」ツつ甘・ツ崢榲ィツサツ「
            if(q.dir%2==1)  bsnum = 0, snum = 1;
            else            bsnum = 1, snum = 0;
            if( q.bs+bsnum<=a && q.s+snum<=a ){
                if( dp[ddy][ddx][(q.dir+1)%4][q.bs+bsnum][q.s+snum] == INF ){
                    dp[ddy][ddx][(q.dir+1)%4][q.bs+bsnum][q.s+snum] = dp[q.y][q.x][q.dir][q.bs][q.s] + 1;
                    que.push( state{ddy, ddx, (int)(q.dir+1)%4, q.bs+bsnum, q.s+snum} );
                }
            }
        }
    }
    
    int ans = INF;
    rep(i,4){
        for(int k=1;;k++){
            int ddy = g.first+dy[i]*k;
            int ddx = g.second+dx[i]*k;
            
            if(ddx<0 || ddy<0 || ddx>=w || ddy>=h)break;
            if(vs[ddy][ddx]=='#')break;

            if( i == 0 && pii(ddy,ddx)==s)break;

            rep(l,a+1){
                rep(m,a+1){
                    ans = min(ans, dp[ddy][ddx][(i+2)%4][l][m]);
                }
            }
        }
    }
    if(ans>2*a)cout<<-1<<endl;
    else cout<<ans<<endl;
}