#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion static T[] Range(int n, Func F) => Enumerable.Range(0, n).Select(_ => F()).ToArray(); const int Max = int.MaxValue / 2; var h = I(); var w = I(); var (sx, sy) = (I(), I()); var g = new bool[h + 2, w + 2]; for (var i = 0; i < h; i++) { var row = I(); for (var j = 0; j < w; j++) g[i + 1, j + 1] = row[j] == '.'; } var qz = Range(I(), () => (I(), I(), I())); var dz = new int[h + 2, w + 2, 3, 3, 2]; for (var i = 1; i <= h; i++) for (var j = 1; j <= w; j++) { for (var dx = 0; dx <= 2; dx++) for (var dy = 0; dy <= 2; dy++) { dz[i, j, dx, dy, 0] = dz[i, j, dx, dy, 1] = Max; } } dz[sx, sy, 1, 1, 0] = 0; var q0 = new Queue<(int, int, int, int, int, int)>(); var q1 = new Queue<(int, int, int, int, int, int)>(); q0.Enqueue((sx, sy, 0, 0, 0, 0)); while (true) { if (q0.Count == 0) { if (q1.Count == 0) break; q0 = q1; q1 = []; continue; } var (qx, qy, qdx, qdy, qf, qd) = q0.Dequeue(); if (qd > dz[qx, qy, qdx + 1, qdy + 1, qf]) continue; for (var dx = -1; dx <= 1; dx++) for (var dy = -1; dy <= 1; dy++) { if ((dx, dy) == (0, 0)) continue; var (x, y) = (qx + dx, qy + dy); if (!g[x, y]) continue; if ((dx, dy) == (qdx, qdy) && dz[x, y, dx + 1, dy + 1, qf] > qd) { dz[x, y, dx + 1, dy + 1, qf] = qd; q0.Enqueue((x, y, dx, dy, qf, qd)); } var nd = qd + 1; var nf = qf ^ 1; if (dz[x, y, dx + 1, dy + 1, nf] > nd) { dz[x, y, dx + 1, dy + 1, nf] = nd; q1.Enqueue((x, y, dx, dy, nf, nd)); } } } dz[sx, sy, 1, 1, 0] = Max; var ans = new List(); foreach (var (x, y, t) in qz) { var qns = false; for (var dx = 0; dx <= 2; dx++) for (var dy = 0; dy <= 2; dy++) for (var f = 0; f < 2; f++) { var d = dz[x, y, dx, dy, f]; if (t >= d && t % 2 == f) qns = true; } ans.Add(qns ? "Yes" : "No"); } Console.WriteLine(string.Join(Environment.NewLine, ans));