/**
*简单的BFS
*/
#include<stdio.h>
#include<queue>
using namespace std;
char map[110][110];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int flag[110][110];//记录x,y坐标节点当前所用的最小的转弯次数。
int m,n,sx,sy,ex,ey,MAXValue;
struct Node{
/**
* x,y当前所在的坐标位置
* dir方向用 0,1,2,3表示四个方向
* step转弯的次数
*/
int x,y,dir,step;
};
bool check(int x,int y){
if(x>=0 && x<m && y>=0 && y<n)return true;
return false;
}
int search(){
int i;
queue<Node>Q;
Node t,temp;
t.x=sx;
t.y=sy;
t.step=-1;
t.dir=-1;
flag[t.x][t.y]=1;
Q.push(t);
while(!Q.empty()){
t=Q.front();
Q.pop();
//在转弯数允许的范围内从起点到达终点
if(t.x==ex && t.y==ey && t.step<=MAXValue)return 1;
for(i=0;i<4;i++){
int tx=dir[i][0]+t.x;
int ty=dir[i][1]+t.y;
//搜索下一节点是否可走
if(check(tx,ty) && flag[tx][ty]>=t.step && t.step<=MAXValue && map[tx][ty]!='*'){
temp.x=tx;
temp.y=ty;
//当前节点方向与上一节点方向不同,则转弯次数加1
if(t.dir!=i){
temp.step=t.step+1;
}else{
//方向相同,转弯数不变
temp.step=t.step;
}
//设置当前节点的方向
temp.dir=i;
//记录搜索到当前节点时最小的转弯次数
if(temp.step<=flag[tx][ty])
flag[tx][ty]=temp.step;
Q.push(temp);
}
}
}
return 0;
}
int main(){
int t,i,j;
scanf("%d",&t);
while(t--){
scanf("%d%d",&m,&n);
for(i=0;i<110;i++){
for(j=0;j<110;j++)flag[i][j]=99999999;
}
for(i=0;i<m;i++){
scanf("%s",map[i]);
}
scanf("%d%d%d%d%d",&MAXValue,&sy,&sx,&ey,&ex);
sy--;
sx--;
ey--;
ex--;
int result=search();
if(result)printf("yes\n");
else printf("no\n");
}
}