#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define Samurai ios_base::sync_with_stdio(false), cout.tie(NULL), cin.tie(NULL);
#define pr_g priority_queue<pair<int,pair<int,int>>, vector<pair<int,pair<int,int>>>,greater<pair<int,pair<int,int>>>>
int dx [] = {0, 0, 1, -1, 1, 1, -1, -1};
int dy [] = {-1, 1, 0, 0, -1, 1, 1, -1};
char dir [] = {'>', '<', '^', 'v'};
int Lx[] = {2, 2, -2, -2, 1, 1, -1, -1};
int Ly[] = {1, -1, 1, -1, 2, -2, 2, -2};
const double PI = acos(-1.0);
#define el '\n'
const ll mod = 1e9 + 7, N = 1e3 + 5, OO = 0x3f3f3f3f;
void solve() {
int R, C; cin >> R >> C;
char A[R][C];
for (int i = 0; i < R; i++)
for (int j = 0; j < C; j++)
cin >> A[i][j];
int vis[R][C];
memset(vis, OO, sizeof vis);
deque<pair<int,int>> q;
q.push_back({0,0});
vis[0][0] = 0;
while (q.size()) {
int a = q.front().first;
int b = q.front().second;
q.pop_front();
if (a == R - 1 && b == C - 1) {
cout << vis[a][b] << el;
return;
}
for (int i = 0; i < 4; i++) {
int x = a + dx[i];
int y = b + dy[i];
if (x >= 0 && x < R && y >= 0 && y < C) {
int u = vis[a][b] + (A[a][b] != A[x][y]);
if (vis[x][y] <= u)
continue;
vis[x][y] = u;
if (A[x][y] == A[a][b])
q.push_front({x,y});
else
q.push_back({x,y});
}
}
}
}
int main() { Samurai
int _t = 1; cin >> _t;
for (int i = 1; i <= _t; i++){
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgU2FtdXJhaSBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKSwgY291dC50aWUoTlVMTCksIGNpbi50aWUoTlVMTCk7CiNkZWZpbmUgcHJfZyBwcmlvcml0eV9xdWV1ZTxwYWlyPGludCxwYWlyPGludCxpbnQ+PiwgdmVjdG9yPHBhaXI8aW50LHBhaXI8aW50LGludD4+PixncmVhdGVyPHBhaXI8aW50LHBhaXI8aW50LGludD4+Pj4KaW50IGR4IFtdID0gezAsIDAsIDEsIC0xLCAxLCAxLCAtMSwgLTF9OwppbnQgZHkgW10gPSB7LTEsIDEsIDAsIDAsIC0xLCAxLCAxLCAtMX07CmNoYXIgZGlyIFtdID0geyc+JywgJzwnLCAnXicsICd2J307CmludCBMeFtdID0gezIsIDIsIC0yLCAtMiwgMSwgMSwgLTEsIC0xfTsKaW50IEx5W10gPSB7MSwgLTEsIDEsIC0xLCAyLCAtMiwgMiwgLTJ9Owpjb25zdCBkb3VibGUgUEkgPSBhY29zKC0xLjApOwojZGVmaW5lIGVsICdcbicKY29uc3QgbGwgbW9kID0gMWU5ICsgNywgTiA9IDFlMyArIDUsIE9PID0gMHgzZjNmM2YzZjsKCnZvaWQgc29sdmUoKSB7CiAgICBpbnQgUiwgQzsgY2luID4+IFIgPj4gQzsKCiAgICBjaGFyIEFbUl1bQ107CiAgICBmb3IgKGludCBpID0gMDsgaSA8IFI7IGkrKykKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEM7IGorKykKICAgICAgICAgICAgY2luID4+IEFbaV1bal07CgogICAgaW50IHZpc1tSXVtDXTsKICAgIG1lbXNldCh2aXMsIE9PLCBzaXplb2YgdmlzKTsKICAgIGRlcXVlPHBhaXI8aW50LGludD4+IHE7CiAgICBxLnB1c2hfYmFjayh7MCwwfSk7CiAgICB2aXNbMF1bMF0gPSAwOwogICAgd2hpbGUgKHEuc2l6ZSgpKSB7CiAgICAgICAgaW50IGEgPSBxLmZyb250KCkuZmlyc3Q7CiAgICAgICAgaW50IGIgPSBxLmZyb250KCkuc2Vjb25kOwogICAgICAgIHEucG9wX2Zyb250KCk7CiAgICAgICAgaWYgKGEgPT0gUiAtIDEgJiYgYiA9PSBDIC0gMSkgewogICAgICAgICAgICBjb3V0IDw8IHZpc1thXVtiXSA8PCBlbDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICAgICAgaW50IHggPSBhICsgZHhbaV07CiAgICAgICAgICAgIGludCB5ID0gYiArIGR5W2ldOwogICAgICAgICAgICBpZiAoeCA+PSAwICYmIHggPCBSICYmIHkgPj0gMCAmJiB5IDwgQykgewogICAgICAgICAgICAgICAgaW50IHUgPSB2aXNbYV1bYl0gKyAoQVthXVtiXSAhPSBBW3hdW3ldKTsKICAgICAgICAgICAgICAgIGlmICh2aXNbeF1beV0gPD0gdSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIHZpc1t4XVt5XSA9IHU7CiAgICAgICAgICAgICAgICBpZiAoQVt4XVt5XSA9PSBBW2FdW2JdKQogICAgICAgICAgICAgICAgICAgIHEucHVzaF9mcm9udCh7eCx5fSk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgcS5wdXNoX2JhY2soe3gseX0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgppbnQgbWFpbigpIHsgU2FtdXJhaQogICAgaW50IF90ID0gMTsgY2luID4+IF90OwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gX3Q7IGkrKyl7CiAgICAgICAgc29sdmUoKTsKICAgIH0KICAgIHJldHVybiAwOwp9