#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;
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(ll x, ll y) {
visited[x][y]=1;
pair<ll,ll>curr={x,y};
if (grid[curr.first][curr.second]=='U') {
ll next_x=curr.first-1;
ll next_y=curr.second+0;
if(!is_in_border(next_x, next_y)) {
visited[curr.first][curr.second]=2;
return true;
//mark current as 2 escape
}
else if (visited[next_x][next_y]==1) {
//cycle detection
return false;
}
if ( Dfs(next_x, next_y))
{
visited[curr.first][curr.second]=2;
return true;
}
else {
// visited[curr.first][curr.second]=3;//trapped
return false;
}
}
if (grid[curr.first][curr.second]=='R') {
ll next_x=curr.first+0;
ll next_y=curr.second+1;
if(!is_in_border(next_x, next_y)) {
visited[curr.first][curr.second]=2;
return true;
}
if (visited[next_x][next_y]==1) {
//cycle detection
return false;
}
if ( Dfs(next_x, next_y))
{
visited[curr.first][curr.second]=2;
return true;
}
// visited[curr.first][curr.second]=3;//trapped
return false;
}
else if (grid[curr.first][curr.second]=='D') {
ll next_x=curr.first+1;
ll next_y=curr.second+0;
if(!is_in_border(next_x, next_y)) {
visited[curr.first][curr.second]=2;
return true;
}
if (visited[next_x][next_y]==1) {
//cycle detection
return false;
}
if ( Dfs(next_x, next_y))
{
visited[curr.first][curr.second]=2;
return true;
}
// visited[curr.first][curr.second]=3;//trapped
return false;
}
else if (grid[curr.first][curr.second]=='L') {
ll next_x=curr.first+0;
ll next_y=curr.second-1;
if(!is_in_border(next_x, next_y)) {
visited[curr.first][curr.second]=2;
return true;
}
else if (visited[next_x][next_y]==1) {
//loop
return false;
}
if ( Dfs(next_x, next_y))
{
visited[curr.first][curr.second]=2;
return true;
}
//visited[curr.first][curr.second]=3;//trapped
return false;
}
else 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+CiNkZWZpbmUgc2FuZHJhIGlvczo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKI2luY2x1ZGUgPGlvc3RyZWFtPgojZGVmaW5lIGVsICdcbicKI2RlZmluZSBsbCBsb25nIGxvbmcKbG9uZyBsb25nIGdjZChsb25nIGxvbmcgYSwgbG9uZyBsb25nIGIpIHsgcmV0dXJuICghYSkgPyBiIDogZ2NkKGIgJSBhLCBhKTsgfQovL2NvbXBsZXhpdHkgbyhsb2dhKmIpCmxvbmcgbG9uZyBsY20obG9uZyBsb25nIGEsIGxvbmcgbG9uZyBiKSB7IHJldHVybiAoYSAqIGIpIC8gZ2NkKGEsIGIpOyB9CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmxsIG4sbTsKdmVjdG9yPHZlY3RvcjxjaGFyPj5ncmlkPXt9Owp2ZWN0b3I8dmVjdG9yPGxsPj52aXNpdGVkPXt9OwpsbCBkeFtdPXstMSwwLDEsMH07CmxsIGR5W109ezAsMSwwLC0xfTsKY2hhciBkaXJlY3RbXT17J1UnLCdSJywnRCcsJ0wnfTsKCmJvb2wgaXNfaW5fYm9yZGVyKGxsIGksbGwgaikgewogICAgcmV0dXJuIGk+PTAgJiYgaTxuICYmIGo+PTAgJiYgajxtOwp9CmJvb2wgRGZzKGxsIHgsIGxsIHkpIHsKICAgIHZpc2l0ZWRbeF1beV09MTsKICAgICAgICBwYWlyPGxsLGxsPmN1cnI9e3gseX07CiAgICAgICAgaWYgKGdyaWRbY3Vyci5maXJzdF1bY3Vyci5zZWNvbmRdPT0nVScpIHsKICAgICAgICAgICAgbGwgbmV4dF94PWN1cnIuZmlyc3QtMTsKICAgICAgICAgICAgbGwgbmV4dF95PWN1cnIuc2Vjb25kKzA7CiAgICAgICAgICAgIGlmKCFpc19pbl9ib3JkZXIobmV4dF94LCBuZXh0X3kpKSB7CiAgICAgICAgICAgICAgICB2aXNpdGVkW2N1cnIuZmlyc3RdW2N1cnIuc2Vjb25kXT0yOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAvL21hcmsgY3VycmVudCBhcyAyIGVzY2FwZQogICAgICAgICAgICB9CgogICAgICAgICAgICBlbHNlIGlmICh2aXNpdGVkW25leHRfeF1bbmV4dF95XT09MSkgewogICAgICAgICAgICAgICAgLy9jeWNsZSBkZXRlY3Rpb24KICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIERmcyhuZXh0X3gsIG5leHRfeSkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdmlzaXRlZFtjdXJyLmZpcnN0XVtjdXJyLnNlY29uZF09MjsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyB2aXNpdGVkW2N1cnIuZmlyc3RdW2N1cnIuc2Vjb25kXT0zOy8vdHJhcHBlZAogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIGlmIChncmlkW2N1cnIuZmlyc3RdW2N1cnIuc2Vjb25kXT09J1InKSB7CiAgICAgICAgIGxsIG5leHRfeD1jdXJyLmZpcnN0KzA7CiAgICAgICAgIGxsIG5leHRfeT1jdXJyLnNlY29uZCsxOwogICAgICAgICBpZighaXNfaW5fYm9yZGVyKG5leHRfeCwgbmV4dF95KSkgewogICAgICAgICAgICAgdmlzaXRlZFtjdXJyLmZpcnN0XVtjdXJyLnNlY29uZF09MjsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CgogICAgICAgICBpZiAodmlzaXRlZFtuZXh0X3hdW25leHRfeV09PTEpIHsKICAgICAgICAgICAgIC8vY3ljbGUgZGV0ZWN0aW9uCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoIERmcyhuZXh0X3gsIG5leHRfeSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHZpc2l0ZWRbY3Vyci5maXJzdF1bY3Vyci5zZWNvbmRdPTI7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICAvLyB2aXNpdGVkW2N1cnIuZmlyc3RdW2N1cnIuc2Vjb25kXT0zOy8vdHJhcHBlZAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGVsc2UgaWYgKGdyaWRbY3Vyci5maXJzdF1bY3Vyci5zZWNvbmRdPT0nRCcpIHsKICAgICAgICAgbGwgbmV4dF94PWN1cnIuZmlyc3QrMTsKICAgICAgICAgbGwgbmV4dF95PWN1cnIuc2Vjb25kKzA7CiAgICAgICAgIGlmKCFpc19pbl9ib3JkZXIobmV4dF94LCBuZXh0X3kpKSB7CiAgICAgICAgICAgICB2aXNpdGVkW2N1cnIuZmlyc3RdW2N1cnIuc2Vjb25kXT0yOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KCiAgICAgICAgICBpZiAodmlzaXRlZFtuZXh0X3hdW25leHRfeV09PTEpIHsKICAgICAgICAgICAgIC8vY3ljbGUgZGV0ZWN0aW9uCgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CgogICAgICAgICBpZiAoIERmcyhuZXh0X3gsIG5leHRfeSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHZpc2l0ZWRbY3Vyci5maXJzdF1bY3Vyci5zZWNvbmRdPTI7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICAvLyB2aXNpdGVkW2N1cnIuZmlyc3RdW2N1cnIuc2Vjb25kXT0zOy8vdHJhcHBlZAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGVsc2UgaWYgKGdyaWRbY3Vyci5maXJzdF1bY3Vyci5zZWNvbmRdPT0nTCcpIHsKICAgICAgICAgbGwgbmV4dF94PWN1cnIuZmlyc3QrMDsKICAgICAgICAgbGwgbmV4dF95PWN1cnIuc2Vjb25kLTE7CiAgICAgICAgIGlmKCFpc19pbl9ib3JkZXIobmV4dF94LCBuZXh0X3kpKSB7CiAgICAgICAgICAgICB2aXNpdGVkW2N1cnIuZmlyc3RdW2N1cnIuc2Vjb25kXT0yOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAodmlzaXRlZFtuZXh0X3hdW25leHRfeV09PTEpIHsKICAgICAgICAgICAgIC8vbG9vcAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmICggRGZzKG5leHRfeCwgbmV4dF95KSkKICAgICAgICAgewogICAgICAgICAgICAgdmlzaXRlZFtjdXJyLmZpcnN0XVtjdXJyLnNlY29uZF09MjsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIC8vdmlzaXRlZFtjdXJyLmZpcnN0XVtjdXJyLnNlY29uZF09MzsvL3RyYXBwZWQKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBlbHNlIGlmIChncmlkW2N1cnIuZmlyc3RdW2N1cnIuc2Vjb25kXT09Jz8nKSB7CiAgICAgICAgIC8vaDNtbCBlbCA0IGE3dG1hbGF0IGxsID8gZGVoCiAgICAgICAgIGZvciAoaW50IGk9MDtpPDQ7aSsrKSB7CiAgICAgICAgICAgICBncmlkW2N1cnIuZmlyc3RdW2N1cnIuc2Vjb25kXT1kaXJlY3RbaV07CiAgICAgICAgICAgICBsbCBuZXh0X3g9Y3Vyci5maXJzdCtkeFtpXTsKICAgICAgICAgICAgIGxsIG5leHRfeT1jdXJyLnNlY29uZCtkeVtpXTsKICAgICAgICAgICAgIGlmICghaXNfaW5fYm9yZGVyKG5leHRfeCwgbmV4dF95KSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHZpc2l0ZWRbbmV4dF94XVtuZXh0X3ldPT0xIHx8ICFEZnMobmV4dF94LCBuZXh0X3kpKSB7CiAgICAgICAgICAgICAgICAgLy8gLy9jeWNsZQogICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIHZpc2l0ZWRbY3Vyci5maXJzdF1bY3Vyci5zZWNvbmRdPTM7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2aXNpdGVkW2N1cnIuZmlyc3RdW2N1cnIuc2Vjb25kXT0yOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CnZvaWQgc29sdmUoKSB7CiAgICBjaW4+Pm4+Pm07CiAgICBncmlkLmFzc2lnbihuLHZlY3RvcjxjaGFyPihtKSk7CiAgICB2aXNpdGVkLmFzc2lnbihuLHZlY3RvcjxsbD4obSwwKSk7CiAgICBmb3IoaW50IGk9MDtpPG47aSsrKSB7CiAgICAgICAgZm9yKGludCBqPTA7ajxtO2orKykgewogICAgICAgICAgICBjaW4+PmdyaWRbaV1bal07CiAgICAgICAgfQogICAgfQogICAgbGwgZXNjYXBlZD0wOwogICAgZm9yKGludCBpPTA7aTxuO2krKykgewogICAgICAgIGZvcihpbnQgaj0wO2o8bTtqKyspIHsKICAgICAgICAgICAgaWYgKHZpc2l0ZWRbaV1bal09PTApIHsKICAgICAgICAgICAgICAgIERmcyhpLGopOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZm9yKGludCBpPTA7aTxuO2krKykgewogICAgICAgIGZvcihpbnQgaj0wO2o8bTtqKyspIHsKICAgICAgICAgICAgaWYgKHZpc2l0ZWRbaV1bal09PTIpIHsKICAgICAgICAgICAgICAgIGVzY2FwZWQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGxsIGFsbD1uKm07CiAgICBjb3V0PDxhbGwtZXNjYXBlZDw8ZWw7Cn0KCnNpZ25lZCBtYWluKCkgewogICAgc2FuZHJhCmxsIHQ9MTsKICAgIGNpbj4+dDsKICAgIHdoaWxlKHQtLSkgewogICAgICAgIHNvbHZlKCk7CiAgICB9Cn0=