cf168div2b

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <queue> #include <vector> #include <cstdlib> #include <functional> #include <string> #define N 55 using namespace std; char ch[N][N]; int vis[N][N][4][2],f[N][N],st[N*N],top=0; int dx[4]={1,-1,0,0,},dy[4]={0,0,1,-1}; int n,m; bool check(int x,int y) { if(x<0||x>=n)return 0; if(y<0||y>=m)return 0; if(ch[x][y]=='W')return 0; return 1; } void dfs(int x,int y,int k,int used) { vis[x][y][k][used]=1; f[x][y]=1; int tx=x+dx[k],ty=y+dy[k]; if(check(tx,ty)&&!vis[tx][ty][k][used])dfs(tx,ty,k,used); if(used)return; for(int i=0;i<4;i++) { if(i==k)continue; int tx=x+dx[i],ty=y+dy[i]; if(check(tx,ty)&&!vis[tx][ty][i][1])dfs(tx,ty,i,1); } } int main() { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",ch[i]); for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(ch[i][j]=='B') { int p=i*m+j; st[top++]=p;//千万不能写成st[top++] = i*m+j; 不稳定。。 } for(int i=0;i<top;i++) { memset(vis,0,sizeof(vis)); memset(f,0,sizeof(f)); int x=st[i]/m,y=st[i]%m; for(int j=0;j<4;j++) { dfs(x,y,j,0); } for(int j=i;j<top;j++) { int xx=st[j]/m,yy=st[j]%m; if(!f[xx][yy]) { puts("NO"); return 0; } } } puts("YES"); return 0; }