submission
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define FIO ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define sp_el(i,n) " \n"[i==n]
#define put_ret(MSG) return cout<<MSG<<endl,void()
using namespace std;
void Init()
{
}
const int L=305,N=20,dx[4]={-1,0,0,1},dy[4]={0,-1,1,0};
int n,m,k;
string g[L];
int dis[N][N],dp[1<<N][N],cnt,X[N],Y[N],id[L][L],Gid;
bool vis[N][N];
#define MP make_pair
#define F first
#define S second
#define B(x) (1<<(((x)-1)))
void dfs(int sx,int sy)
{
queue<pair<pair<int,int>,int> >q;
memset(vis,0,sizeof(vis));
dis[id[sx][sy]][id[sx][sy]]=0;
vis[sx][sy]=1;
q.push(MP(MP(sx,sy),0));
while(q.size())
{
int x=q.front().F.F,y=q.front().F.S,d=q.front().S;q.pop();
if(g[x][y]=='o'||g[x][y]=='S'||g[x][y]=='G')
{
if(id[x][y]<0)
{
X[++cnt]=x,Y[cnt]=y,id[x][y]=cnt;
if(g[x][y]=='G')Gid=cnt;
}
dis[id[sx][sy]][id[x][y]]=d;
}
for(int i=0;i<4;i++)
{
int xx=x+dx[i],yy=y+dy[i];
if(xx<1||xx>n||yy<1||yy>m||g[xx][yy]=='#')continue;
if(!vis[xx][yy])
vis[xx][yy]=1,q.push(MP(MP(xx,yy),d+1));
}
}
}
void Solve()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++){cin>>g[i];g[i]="$"+g[i];}
memset(dis,0x3f,sizeof(dis));
memset(dp,0x3f,sizeof(dp));
memset(id,-1,sizeof(id));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(g[i][j]=='S')X[0]=i,Y[0]=j,id[i][j]=0;
dfs(X[0],Y[0]);
if(!Gid)put_ret(-1);
for(int i=1;i<=cnt;i++)dfs(X[i],Y[i]);
dp[1][0]=0;
for(int i=1;i<(1<<cnt+1);i++)
{
for(int j=0;j<=cnt;j++)
for(int k=0;k<=cnt;k++)
dp[i|B(k+1)][k]=min(dp[i|B(k+1)][k],dp[i][j]+dis[j][k]);
}
int ans=-1;
for(int i=1;i<(1<<cnt+1);i++)
if(dp[i][Gid]<=k)ans=max(ans,__builtin_popcount(i)-2);
cout<<ans;
}
void QingKong()
{
}
int main()
{
#ifdef LOCAL
ll STE=clock();
#endif
FIO;
int T=1;
Init();
while(T--)
{
Solve();
QingKong();
}
#ifdef LOCAL
ll ETE=clock();
cerr<<"\n\n-----------------------\nProgram done in "<<ETE-STE<<" ms";
#endif
return 0;
}