/*
分析:
桑透了俺嫩小类心灵~,半个月前看到此题,惊为水题,
结果敲完代码,愣是俩小时牟找出哪儿WA了。今儿再次邂逅
了。。。一遍AC了。。。桑心了~。。。
2012-08-20
*/
分析:
桑透了俺嫩小类心灵~,半个月前看到此题,惊为水题,
结果敲完代码,愣是俩小时牟找出哪儿WA了。今儿再次邂逅
了。。。一遍AC了。。。桑心了~。。。
2012-08-20
*/
#include"stdio.h"
#include"string.h"
#include"queue"
using namespace std;
int map[511][511];
int flag[511][511];
int n,m,delay;
int x_s,y_s;
int x_e,y_e;
int dir[4][2]={1,0, -1,0, 0,1, 0,-1};
struct node
{
int x,y;
int step;
friend bool operator<(node n1,node n2)
{
return n2.step<n1.step;
}
};
int Judge(int x,int y)
{
if(x<0 || x>=n || y<0 || y>=m) return 1;
if(map[x][y]==-1) return 1;
if(flag[x][y]==1) return 1;
return 0;
}
int BFS()
{
priority_queue<node>q;
node cur,next;
int i;
memset(flag,0,sizeof(flag));
cur.x=x_s;
cur.y=y_s;
cur.step=0;
flag[cur.x][cur.y]=1;
q.push(cur);
while(!q.empty())
{
cur=q.top();
q.pop();
if(cur.x==x_e && cur.y==y_e) return cur.step+1;
for(i=0;i<4;i++)
{
next.x=cur.x+dir[i][0];
next.y=cur.y+dir[i][1];
if(Judge(next.x,next.y)) continue;
next.step=cur.step+1;
if(map[next.x][next.y]==1) next.step+=delay;
q.push(next);
flag[next.x][next.y]=1;
}
}
return -1;
}
int main()
{
int T;
int i,l;
char str[611];
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&delay);
for(i=0;i<n;i++)
{
scanf("%s",str);
for(l=0;str[l];l++)
{
if(str[l]=='#') map[i][l]=-1;
else if(str[l]=='.')map[i][l]=0;
else if(str[l]=='@')map[i][l]=1;
else if(str[l]=='S')
{
map[i][l]=0;
x_s=i;
y_s=l;
}
}
}
for(l=0;l<m;l++) if(map[0][l]>=0) {x_e=0;y_e=l;break;}
for(l=0;l<m;l++) if(map[n-1][l]>=0) {x_e=n-1;y_e=l;break;}
for(i=0;i<n;i++) if(map[i][0]>=0) {x_e=i;y_e=0;break;}
for(i=0;i<n;i++) if(map[i][m-1]>=0) {x_e=i;y_e=m-1;break;}
printf("%d\n",BFS());
}
return 0;
}