#include <bits/stdc++.h>
#define sandra ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#include <iostream>
#define el '\n'
#define ll long long
long long gcd(long long a, long long b) { return (!a) ? b : gcd(b % a, a); }
//complexity o(loga*b)
long long lcm(long long a, long long b) { return (a * b) / gcd(a, b); }
using namespace std;
const ll N = 32768, MOD = 32768, INF = 1e9 + 3;
ll n,m;
vector<vector<char>>grid={};
vector<vector<ll>>visited={};
ll dx[]={-1,0,1,0};
ll dy[]={0,1,0,-1};
char direct[]={'U','R','D','L'};
bool is_in_border(ll i,ll j) {
return i>=0 && i<n && j>=0 && j<m;
}
bool Dfs(long long next_x, long long next_y);
bool check(pair<ll,ll>curr,char dir) {
ll next_x=curr.first;
ll next_y=curr.second;
if (dir=='U') {
next_x=next_x-1;
}
else if (dir=='R') {
next_y=next_y+1;
}
else if (dir=='D') {
next_x=next_x+1;
}
else if (dir=='L') {
next_y=next_y-1;
}
if(!is_in_border(next_x, next_y)) {
visited[curr.first][curr.second]=2;
return true;
//mark current as 2 escape
}
if (visited[next_x][next_y]==1) {
//cycle detection
return false;
}
if (visited[next_x][next_y] == 2) {
visited[curr.first][curr.second] = 2;
return true;
}
if (Dfs(next_x, next_y))
{
visited[curr.first][curr.second]=2;
return true;
}
return false;
}
bool Dfs(ll x, ll y) {
visited[x][y]=1;
pair<ll,ll>curr={x,y};
char directionn=grid[x][y];
if (grid[curr.first][curr.second]!='?') {
return check(curr,directionn);
}
if (grid[curr.first][curr.second]=='?') {
//h3ml el 4 a7tmalat ll ? deh
for (int i=0;i<4;i++) {
grid[curr.first][curr.second]=direct[i];
ll next_x=curr.first+dx[i];
ll next_y=curr.second+dy[i];
if (!is_in_border(next_x, next_y)) {
continue;
}
if (visited[next_x][next_y]==1 || !Dfs(next_x, next_y)) {
// //cycle
// continue;
visited[curr.first][curr.second]=3;
return false;
}
}
visited[curr.first][curr.second]=2;
return true;
}
return false;
}
void solve() {
cin>>n>>m;
grid.assign(n,vector<char>(m));
visited.assign(n,vector<ll>(m,0));
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
cin>>grid[i][j];
}
}
ll escaped=0;
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if (visited[i][j]==0) {
Dfs(i,j);
}
}
}
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if (visited[i][j]==2) {
escaped++;
}
}
}
ll all=n*m;
cout<<all-escaped<<el;
}
signed main() {
sandra
ll t=1;
cin>>t;
while(t--) {
solve();
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgc2FuZHJhIGlvczo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKI2luY2x1ZGUgPGlvc3RyZWFtPgojZGVmaW5lIGVsICdcbicKI2RlZmluZSBsbCBsb25nIGxvbmcKbG9uZyBsb25nIGdjZChsb25nIGxvbmcgYSwgbG9uZyBsb25nIGIpIHsgcmV0dXJuICghYSkgPyBiIDogZ2NkKGIgJSBhLCBhKTsgfQovL2NvbXBsZXhpdHkgbyhsb2dhKmIpCmxvbmcgbG9uZyBsY20obG9uZyBsb25nIGEsIGxvbmcgbG9uZyBiKSB7IHJldHVybiAoYSAqIGIpIC8gZ2NkKGEsIGIpOyB9CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGxsIE4gPSAzMjc2OCwgTU9EID0gMzI3NjgsIElORiA9IDFlOSArIDM7CmxsIG4sbTsKdmVjdG9yPHZlY3RvcjxjaGFyPj5ncmlkPXt9Owp2ZWN0b3I8dmVjdG9yPGxsPj52aXNpdGVkPXt9OwpsbCBkeFtdPXstMSwwLDEsMH07CmxsIGR5W109ezAsMSwwLC0xfTsKY2hhciBkaXJlY3RbXT17J1UnLCdSJywnRCcsJ0wnfTsKCmJvb2wgaXNfaW5fYm9yZGVyKGxsIGksbGwgaikgewogICAgcmV0dXJuIGk+PTAgJiYgaTxuICYmIGo+PTAgJiYgajxtOwp9Cgpib29sIERmcyhsb25nIGxvbmcgbmV4dF94LCBsb25nIGxvbmcgbmV4dF95KTsKCmJvb2wgY2hlY2socGFpcjxsbCxsbD5jdXJyLGNoYXIgZGlyKSB7CiAgICBsbCBuZXh0X3g9Y3Vyci5maXJzdDsKICAgIGxsIG5leHRfeT1jdXJyLnNlY29uZDsKICAgIGlmIChkaXI9PSdVJykgewogICAgICAgIG5leHRfeD1uZXh0X3gtMTsKICAgIH0KICAgIGVsc2UgaWYgKGRpcj09J1InKSB7CiAgICAgICAgbmV4dF95PW5leHRfeSsxOwogICAgfQogICAgZWxzZSBpZiAoZGlyPT0nRCcpIHsKICAgICAgICBuZXh0X3g9bmV4dF94KzE7CiAgICB9CiAgICBlbHNlIGlmIChkaXI9PSdMJykgewogICAgICAgIG5leHRfeT1uZXh0X3ktMTsKICAgIH0KICAgIGlmKCFpc19pbl9ib3JkZXIobmV4dF94LCBuZXh0X3kpKSB7CiAgICAgICAgdmlzaXRlZFtjdXJyLmZpcnN0XVtjdXJyLnNlY29uZF09MjsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAvL21hcmsgY3VycmVudCBhcyAyIGVzY2FwZQogICAgfQoKICAgIGlmICh2aXNpdGVkW25leHRfeF1bbmV4dF95XT09MSkgewogICAgICAgIC8vY3ljbGUgZGV0ZWN0aW9uCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHZpc2l0ZWRbbmV4dF94XVtuZXh0X3ldID09IDIpIHsKICAgICAgICB2aXNpdGVkW2N1cnIuZmlyc3RdW2N1cnIuc2Vjb25kXSA9IDI7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoRGZzKG5leHRfeCwgbmV4dF95KSkKICAgIHsKICAgICAgICB2aXNpdGVkW2N1cnIuZmlyc3RdW2N1cnIuc2Vjb25kXT0yOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9Cgpib29sIERmcyhsbCB4LCBsbCB5KSB7CiAgICB2aXNpdGVkW3hdW3ldPTE7CiAgICAgICAgcGFpcjxsbCxsbD5jdXJyPXt4LHl9OwogICAgY2hhciBkaXJlY3Rpb25uPWdyaWRbeF1beV07CgogICAgICAgaWYgKGdyaWRbY3Vyci5maXJzdF1bY3Vyci5zZWNvbmRdIT0nPycpIHsKICAgICAgICAgICByZXR1cm4gY2hlY2soY3VycixkaXJlY3Rpb25uKTsKICAgICAgIH0KICAgICAgaWYgKGdyaWRbY3Vyci5maXJzdF1bY3Vyci5zZWNvbmRdPT0nPycpIHsKICAgICAgICAgLy9oM21sIGVsIDQgYTd0bWFsYXQgbGwgPyBkZWgKICAgICAgICAgZm9yIChpbnQgaT0wO2k8NDtpKyspIHsKICAgICAgICAgICAgIGdyaWRbY3Vyci5maXJzdF1bY3Vyci5zZWNvbmRdPWRpcmVjdFtpXTsKICAgICAgICAgICAgIGxsIG5leHRfeD1jdXJyLmZpcnN0K2R4W2ldOwogICAgICAgICAgICAgbGwgbmV4dF95PWN1cnIuc2Vjb25kK2R5W2ldOwogICAgICAgICAgICAgaWYgKCFpc19pbl9ib3JkZXIobmV4dF94LCBuZXh0X3kpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CgogICAgICAgICAgICAgaWYgKHZpc2l0ZWRbbmV4dF94XVtuZXh0X3ldPT0xIHx8ICFEZnMobmV4dF94LCBuZXh0X3kpKSB7CiAgICAgICAgICAgICAgICAgLy8gLy9jeWNsZQogICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIHZpc2l0ZWRbY3Vyci5maXJzdF1bY3Vyci5zZWNvbmRdPTM7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgIHZpc2l0ZWRbY3Vyci5maXJzdF1bY3Vyci5zZWNvbmRdPTI7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KCnZvaWQgc29sdmUoKSB7CiAgICBjaW4+Pm4+Pm07CiAgICBncmlkLmFzc2lnbihuLHZlY3RvcjxjaGFyPihtKSk7CiAgICB2aXNpdGVkLmFzc2lnbihuLHZlY3RvcjxsbD4obSwwKSk7CiAgICBmb3IoaW50IGk9MDtpPG47aSsrKSB7CiAgICAgICAgZm9yKGludCBqPTA7ajxtO2orKykgewogICAgICAgICAgICBjaW4+PmdyaWRbaV1bal07CiAgICAgICAgfQogICAgfQogICAgbGwgZXNjYXBlZD0wOwogICAgZm9yKGludCBpPTA7aTxuO2krKykgewogICAgICAgIGZvcihpbnQgaj0wO2o8bTtqKyspIHsKICAgICAgICAgICAgaWYgKHZpc2l0ZWRbaV1bal09PTApIHsKICAgICAgICAgICAgICAgIERmcyhpLGopOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZm9yKGludCBpPTA7aTxuO2krKykgewogICAgICAgIGZvcihpbnQgaj0wO2o8bTtqKyspIHsKICAgICAgICAgICAgaWYgKHZpc2l0ZWRbaV1bal09PTIpIHsKICAgICAgICAgICAgICAgIGVzY2FwZWQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGxsIGFsbD1uKm07CiAgICBjb3V0PDxhbGwtZXNjYXBlZDw8ZWw7Cn0Kc2lnbmVkIG1haW4oKSB7CiAgICBzYW5kcmEKbGwgdD0xOwogICAgY2luPj50OwogICAgd2hpbGUodC0tKSB7CiAgICAgICAgc29sdmUoKTsKICAgIH0KfQo=