/* 刚开始学习java 代码写起来总是很搓的 */ import java.io.*; import java.util.*; class Node { int x, y, pre, count; Node(int x, int y, int pre, int count) { this.x = x; this.y = y; this.pre = pre; this.count = count; } } public class Main1728 { static int dir[][] = {{-1, 0}, {1, 0}, {0,1}, {0,-1}}; static char map[][] = new char[105][105]; static boolean hash[][] = new boolean[105][105]; static int n, m, k; static PrintWriter cout = new PrintWriter (new OutputStreamWriter(System.out)); static boolean index(Node now) { if(now.x >= 0 && now.x < n && now.y >= 0 && now.y < m && now.count <= k && map[now.x][now.y] != '*') return true; return false; } static void BFS(int x1, int y1, int x2, int y2) { if(x1 == x2 && y1 == y2) { cout.println("yes"); cout.flush(); return; } for(int i = 0; i <= n; i++) for(int j = 0; j <= m; j++) hash[i][j] = false; Queue <Node> Q = new LinkedList<Node>(); Q.clear(); hash[x1][y1] = true; for(int i = 0; i < 4; i++) { int tx = x1 + dir[i][0]; int ty = y1 + dir[i][1]; int tp = i; int tc = 0; Node next = new Node(tx, ty, tp, tc); if(!index(next)) continue; if(!hash[tx][ty]) { //cout.println(next.x + " 111 " + next.y + " " + next.count + " " + next.pre); Q.add(next); hash[next.x][next.y] = true; } int xxx = x1; int yyy = y1; while(true) { tx = xxx + dir[i][0]; ty = yyy + dir[i][1]; tp = i; tc = 0; Node nex = new Node(tx, ty, tp, tc); if(index(nex)) { if(nex.x == x2 && nex.y == y2) { cout.println("yes"); cout.flush(); return ; } //if(!hash[tx][ty]) { Q.add(nex); hash[nex.x][nex.y] = true; } } else break; xxx = nex.x; yyy = nex.y; } } Node now = new Node(0, 0, 0, 0); while(!Q.isEmpty()) { now = Q.poll(); //cout.println(now.x + " 222 " + now.y + " " + now.count + " " + now.pre); if(now.x == x2 && now.y == y2) { cout.println("yes"); cout.flush(); return ; } int xx = now.x; int yy = now.y; while(true) { int tx = xx + dir[now.pre][0]; int ty = yy + dir[now.pre][1]; int tp = now.pre; int tc = now.count; Node next = new Node(tx, ty, tp, tc); if(index(next)) { if(next.x == x2 && next.y == y2) { cout.println("yes"); cout.flush(); return ; } if(!hash[tx][ty]) { Q.add(next); hash[next.x][next.y] = true; } } else break; xx = next.x; yy = next.y; } for(int i = 0; i < 4; i++) { if(i == now.pre) continue; int tx = now.x + dir[i][0]; int ty = now.y + dir[i][1]; int tp = i; int tc = now.count + 1; Node next = new Node(tx, ty, tp, tc); if(!index(next)) continue; if(!hash[tx][ty]) { if(next.x == x2 && next.y == y2) { cout.println("yes"); cout.flush(); return ; } Q.add(next); hash[tx][ty] = true; } xx = next.x; yy = next.y; int tp1 = next.pre; int tc1 = next.count; while(true) { tx = xx + dir[tp1][0]; ty = yy + dir[tp1][1]; tp = tp1;; tc = tc1; Node nextt = new Node(tx, ty, tp, tc); if(index(nextt)) { if(nextt.x == x2 && nextt.y == y2) { cout.println("yes"); cout.flush(); return ; } if(!hash[tx][ty]) { Q.add(nextt); hash[nextt.x][nextt.y] = true; } } else break; xx = nextt.x; yy = nextt.y; } } } cout.println("no"); cout.flush(); return ; } public static void main(String[] args) { //StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); int t; Scanner in = new Scanner(System.in); t = in.nextInt(); while(t-- > 0) { n = in.nextInt(); m = in.nextInt(); String s = new String(); for(int i = 0; i < n; i++) { s = in.next(); map[i] = s.toCharArray(); } k = in.nextInt(); int x1, y1, x2, y2; y1 = in.nextInt(); y1--; x1 = in.nextInt(); x1--; y2 = in.nextInt(); y2--; x2 = in.nextInt(); x2--; BFS(x1, y1, x2, y2); } } }