向前走,何处是终点呢?
//CodeForces - 1365D
#include<iostream>
#include<string.h>
using namespace std;
int x_f[4] = {-1,0,1,0};
int y_f[4] = {0,1,0,-1};
char mp[55][55];
bool vis[55][55];
int t,n,m;
struct MAN{
int x,y;
}bad_loc[2500],good_loc[2500];
void dfs(int x,int y){
vis[x][y] = 1;
for(int i = 0;i < 4;i++){
int a = x + x_f[i];
int b = y + y_f[i];
if(a >= 1 && a <= n && b >= 1 && b <= m && mp[a][b] != '#' && !vis[a][b])
dfs(a,b);
}
}
void solve(){
int cnt_g = 0,cnt_b = 0;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
if(mp[i][j] == 'B'){
bad_loc[cnt_b].x = i;bad_loc[cnt_b].y = j;
cnt_b++;
}
if(mp[i][j] == 'G'){
good_loc[cnt_g].x = i;good_loc[cnt_g].y = j;
cnt_g++;
}
}
}
if(cnt_g == 0){
cout << "Yes\n";
return;
}else{
int flag1 = 0;
for(int i = 0;i < cnt_b;i++){
int x_1 = bad_loc[i].x,y_1 = bad_loc[i].y;
for(int j = 0;j < 4;j++){
if(mp[x_1+x_f[j]][y_1+y_f[j]] == 'G'){
flag1++;
}
}
if(flag1 > 0){
cout << "No\n";
return;
}else{
for(int j = 0;j < 4;j++) {
int a = x_1 + x_f[j];
int b = y_1 + y_f[j];
if (a >= 1 && a <= n && b >= 1 && b <= m && mp[a][b] == '.') {
mp[a][b] = '#';
}
}
}
}
memset(vis,0,sizeof vis);
if(mp[n][m] != '#'){
dfs(n,m);
}
for(int i = 0;i < cnt_g;i++) {
int xxx = good_loc[i].x;
int yyy = good_loc[i].y;
if(!vis[xxx][yyy]){
cout << "No\n";
return;
}
}
for (int i = 0;i < cnt_b; i++){
int xxxxx = bad_loc[i].x;
int yyyyy = bad_loc[i].y;
if (vis[xxxxx][yyyyy]){
cout << "No\n";
return;
}
}
cout << "Yes\n";
}
}
//ccf
int main(){
cin >> t;
while(t--){
cin >> n >> m;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++)
cin >> mp[i][j];
solve();
}
return 0;
}