如果好人和坏人挨在一起肯定不行
否则讲坏人周围的一圈全部围起来,这样是最优的
之后从n,m处看看能否经过所有的好人
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=6e5+10; char s[60][60]; int dx[]={-1,0,1,0}; int dy[]={0,1,0,-1}; int vis[60][60]; int res; int n,m; void dfs(int x,int y){ int i; for(i=0;i<4;i++){ int a=x+dx[i]; int b=y+dy[i]; if(a&&a<=n&&b&&b<=m&&(!vis[a][b])){ if(s[a][b]=='#') continue ; vis[a][b]=1; if(s[a][b]=='G'){ res++; } dfs(a,b); } } } int main(){ ios::sync_with_stdio(false); int t; cin>>t; while(t--){ memset(vis,0,sizeof vis); cin>>n>>m; int i,j; int gcnt=0; int sign=0; for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ cin>>s[i][j]; } } for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ if(s[i][j]=='G') gcnt++; else if(s[i][j]=='B'){ int k; //cout<<i<<" "<<j<<endl; for(k=0;k<4;k++){ int a=i+dx[k]; int b=j+dy[k];//cout<<a<<" "<<b<<endl; if(a&&a<=n&&b&&b<=m){ if(s[a][b]=='G'){ sign=1; break; } else if(s[a][b]=='.'){ s[a][b]='#'; } } } } } } res=0; if(sign){ cout<<"NO"<<endl; continue; } if(s[n][m]!='#'){ vis[n][m]=1; dfs(n,m); } if(res==gcnt) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }