#include #include #include using namespace std; #define INF 1e9 int vx[] = {1, 0, -1, 0}; int vy[] = {0, 1, 0, -1}; char H[60][60]; double DP[60][60][60]; bool in[60][60][60]; struct s { int x, y, z; s(int _x, int _y, int _z) { x = _x; y = _y; z = _z; } }; queue que; int main() { int T; scanf("%d", &T); while( T-- ) { int N, M, K; scanf("%d %d %d", &N, &M, &K); fill(DP[1][1], DP[N][M]+K+1, INF); for(int Ni = 1; Ni <= N; Ni++) for(int Mi = 1; Mi <= M; Mi++) scanf(" %c", &H[Ni][Mi]); int sx, sy, ex, ey; scanf("%d %d %d %d", &sx, &sy, &ex, &ey); DP[sx][sy][K] = 0; que.push(s(sx, sy, K) ); while( !que.empty() ) { s p = que.front(); que.pop(); int x = p.x, y = p.y, z = p.z; in[x][y][z] = false; if( !z ) continue; for(int vi = 0; vi < 4; vi++) { int nx = x+vx[vi]; int ny = y+vy[vi]; if( 1 > nx || nx > N ) continue; if( 1 > ny || ny > M ) continue; if( H[nx][ny] == '#' ) continue; if( DP[nx][ny][z-1] > DP[x][y][z]+(double)abs(H[x][y]-H[nx][ny])/z ) { DP[nx][ny][z-1] = DP[x][y][z]+(double)abs(H[x][y]-H[nx][ny])/z; if( !in[nx][ny][z-1] ) in[nx][ny][z-1] = true, que.push(s(nx, ny, z-1) ); } } } double mn = INF; for(int Ki = 1; Ki <= K; Ki++) mn = min(mn, DP[ex][ey][Ki]); if( mn == INF ) puts("No Answer"); else printf("%.2f\n", mn); } }