# Include <iostream> # include <cstring> # include <vector> # include <queue> using namespace STD; int m, n, H [4] [2] = {1, 0, -, 0,-1}, BZ [55] [55]; char map [55] [55]; struct point {int X, Y, step ;} s, E; vector <int> AA [28]; queue <point> my; int BFS (point S) {int x, y, I, a, B; point t, TT; while (! My. Empty () My. Pop (); my. Push (s); BZ [S. x] [S. Y] = 1; while (! My. empty () {T = My. front (); my. pop (); for (I = 0; I <4; I ++) {x = T. X + H [I] [0]; y = T. Y + H [I] [1]; If (x = E. X & Y = E. y) return T. step + 1; if (x> = 0 & x <M & Y> = 0 & Y <n & BZ [x] [Y] = 0 & map [x] [y]! = '#') {BZ [x] [Y] = 1; if (Map [x] [Y]! = '. ') {If (AA [map [x] [Y]-'a'] [0] = x & aa [map [x] [Y]-'a'] [1] = y) {TT. X = AA [map [x] [Y]-'a'] [2]; TT. y = AA [map [x] [Y]-'a'] [3];} else {TT. X = AA [map [x] [Y]-'a'] [0]; TT. y = AA [map [x] [Y]-'a'] [1];} TT. step = T. step + 1;} else {TT. X = x; TT. y = y; TT. step = T. step + 1;} My. push (TT) ;}}} return-1 ;}int main (void) {int T, I, J, K, X, Y; point P; CIN> T; while (t --) {memset (BZ, 0, sizeof (BZ); CIN> m> N; for (I = 0; I <m; I ++) for (j = 0; j <n; j ++) {CIN> map [I] [J]; if (Map [I] [J]> = 'A' & map [I] [J] <= 'Z ') {AA [map [I] [J]-'a']. push_back (I); AA [map [I] [J]-'a']. push_back (j);} If (Map [I] [J] = 'l') {S. X = I; S. y = J; S. step = 0;} If (Map [I] [J] = 'q') {e. X = I; E. y = J; E. step = 0 ;}} cout <BFS (s) <Endl; for (I = 0; I <28; I ++) AA [I]. clear ();}}