#include<bits/stdc++.h>
using namespace std;
char a[200][200];
int ckl[200][200];
struct inf{
int x,y,k,n;
};
int main()
{
int b,c,d,si,sj;
cin>>b>>c>>d;
for(int i=0;i<b;i++)
for(int j=0;j<c;j++)
{
cin>>a[i][j];
if(a[i][j]=='@')
{
si=i;sj=j;
}
}
queue<inf> q;
q.push((inf){si,sj,d,0});
memset(ckl,-1,sizeof(ckl));
ckl[si][sj]=d;
while(!q.empty())
{
inf t=q.front();
if(a[t.x][t.y]=='+')
{
cout<<t.n<<endl;
return 0;
}
q.pop();
if(t.x>0&&t.k>ckl[t.x-1][t.y])//坐标合法
{
if(a[t.x-1][t.y]=='*')//可直接通过
{
q.push((inf){t.x-1,t.y,t.k,t.n+1});
ckl[t.x-1][t.y]=t.k;
}
else if(a[t.x-1][t.y]=='+'||t.k>0)//可能是#或者+
{
if(a[t.x-1][t.y]=='#')
ckl[t.x-1][t.y]=t.k-1;
else
ckl[t.x-1][t.y]=t.k;
q.push((inf){t.x-1,t.y,t.k-1,t.n+1});
}
}
if(t.x<b-1&&t.k>ckl[t.x+1][t.y])//坐标合法
{
if(a[t.x+1][t.y]=='*')//可直接通过
{
q.push((inf){t.x+1,t.y,t.k,t.n+1});
ckl[t.x+1][t.y]=t.k;
}
else if(a[t.x+1][t.y]=='+'||t.k>0)//可能是#或者+
{
if(a[t.x+1][t.y]=='#')
ckl[t.x+1][t.y]=t.k-1;
else
ckl[t.x+1][t.y]=t.k;
q.push((inf){t.x+1,t.y,t.k-1,t.n+1});
}
}
if(t.y>0&&t.k>ckl[t.x][t.y-1])//坐标合法
{
if(a[t.x][t.y-1]=='*')//可直接通过
{
q.push((inf){t.x,t.y-1,t.k,t.n+1});
ckl[t.x-1][t.y]=t.k;
}
else if(a[t.x][t.y-1]=='+'||t.k>0)//可能是#或者+
{
if(a[t.x][t.y-1]=='#')
ckl[t.x][t.y-1]=t.k-1;
else
ckl[t.x][t.y-1]=t.k;
q.push((inf){t.x,t.y-1,t.k-1,t.n+1});
}
}
if(t.y<c-1&&t.k>ckl[t.x][t.y+1])//坐标合法
{
if(a[t.x][t.y+1]=='*')//可直接通过
{
q.push((inf){t.x,t.y+1,t.k,t.n+1});
ckl[t.x][t.y+1]=t.k;
}
else if(a[t.x][t.y+1]=='+'||t.k>0)//可能是#或者+
{
if(a[t.x][t.y+1]=='#')
ckl[t.x][t.y+1]=t.k-1;
else
ckl[t.x][t.y+1]=t.k;
q.push((inf){t.x,t.y+1,t.k-1,t.n+1});
}
}
}
cout<<"-1"<<endl;
return 0;
}