#include <iostream>
#include <queue>
#include <string>
using namespace std;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int n,m,d,ans,g[102][102][102],head,tail; //g(xyz)表示到(x,y)后还可以飞z步的最优解
bool p[102][102],vis[102][102][102]; //p记录输入数据,vis判重
class node
{
public:
int x,y,d;
node(int x,int y,int d)
{
this->x=x;
this->y=y;
this->d=d;
}
};
queue<node> q;
void ini()
{
while(!q.empty())
q.pop();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=0;k<=d;k++)
g[i][j][k]=102*102;
g[1][1][d]=0;
}
bool legal(int x,int y)
{
if(x<1||x>n||y<1||y>m||!p[x][y]) return false; //越界,湖泊返回false
return true;
}
void bfs()
{
int tx,ty,td,x,y;
ini();
node temp(1,1,d);
q.push(temp);
while(!q.empty())
{
tx=q.front().x;
ty=q.front().y;
td=q.front().d;
q.pop();
for(int i=0;i<4;i++)
{
for(int j=1;j<=td;j++) // Flight
{
x=tx+j*dir[i][0];
y=ty+j*dir[i][1];
if(!legal(x,y)||vis[x][y][td-j]) continue;
g[x][y][td-j]=min(g[x][y][td-j],g[tx][ty][td]+1);
node tmp(x,y,td-j);
q.push(tmp);
vis[x][y][td-j]=1;
if(x==n&&y==m) return;
}
x=tx+dir[i][0]; //Walking
y=ty+dir[i][1];
if(!legal(x,y)||vis[x][y][td]) continue;
g[x][y][td]=min(g[x][y][td],g[tx][ty][td]+1);
node tep(x,y,td);
q.push(tep);
vis[x][y][td]=1;
if(x==n&&y==m) return;
}
}
}
int main()
{
string temp;
cin>>n>>m>>d;
for(int i=1;i<=n;i++)
{
cin>>temp;
for(int j=0;j<m;j++)
if(temp[j]=='P')
p[i][j+1]=1;
}
bfs();
ans=g[n][m][d];
for(int i=0;i<d;i++)
ans=min(ans,g[n][m][i]);
if(ans!=102*102) cout<<ans<<endl;
else cout<<"impossible"<<endl;
system("pause");
return 0;
}