参见题解
#include <iostream>
#include <cstring>
using namespace std;
const int wx[4]={-1,0,1,0};
const int wy[4]={0,-1,0,1};
int n;
int m;
bool hasblock[2002][2002];
void dfsfill(const int x,const int y){
if(x<1||y<1||x>n||y>m){
return;
}
if(hasblock[x][y]){
return;
}
hasblock[x][y]=true;
for(int w=0;w<4;w++){
dfsfill(x+wx[w],y+wy[w]);
}
}
int main(){
int __T;
cin>>__T;
for(int _=0;_<__T;_++){
char temp;
int zqnum=0;
memset(hasblock,0,sizeof(hasblock));
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>temp;
if(temp=='*'){
hasblock[i][j]=true;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(hasblock[i][j]){
continue;
}
bool mk=true;
for(int w=0;w<4;w++){
if(hasblock[i+wx[w]][j+wy[w]]){
mk=false;
break;
}
}
if(mk){
dfsfill(i,j);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(hasblock[i][j]){
continue;
}
zqnum++;
dfsfill(i,j);
}
}
cout<<(zqnum>1?"YES\n":"NO\n");
}
return 0;
}