#include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #include <iostream> using namespace std; const int N = 999999; struct point { int x,y; }s[20000]; char map[110][110]; int turn[110][110]; int n,m,x2,y2,k1,k; int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; void dfs(int x,int y,int dis) { int i,tx,ty; //什么时候返回 if(x==x2&&y==y2&&turn[x][y]<=k) { k1=1; return; } //不能返回的情况 if(turn[x][y]>k) return; //剪枝啊~ if(x!=x2&&y!=y2&&turn[x][y]==k) return; //向上下左右遍历移动~ for (int i=0;i<4;i++) { tx=x+dx[i]; ty=y+dy[i]; if(tx<=0 ||ty<=0||tx>m||ty>n|| map[tx][ty]=='*')//这些地方不能移动 continue;//再找 if(turn[tx][ty]<turn[x][y])//上次走到tx,ty用时比这次小,继续回去找 continue; //以下两个if语句用来剪枝 if(dis!=-1 && i!=dis &&turn[tx][ty]<turn[x][y]+1) continue; if(dis!=-1 && i!=dis) turn[tx][ty]=turn[x][y]+1; else turn[tx][ty]=turn[x][y]; map[tx][ty]='*';//遇到墙,用dfs换方向 dfs(tx,ty,i); map[tx][ty]='.';//不是墙 if(k1) return; } } int main() { int i,j,t,x1,y1; cin>>t; while(t--) { cin>>m>>n; for (i=1;i<=m;i++) { for (j=1;j<=n;j++) { cin>>map[i][j]; } cin>>k>>y1>>x1>>y2>>x2; memset(turn,N,sizeof(turn)); k1=0; turn[x1][y1]=0; dfs(x1,y1,-1); if(k1) cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; } }