cf168div2b

View Code
#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;
}

 

posted on 2013-02-21 21:56  dark_dream  阅读(127)  评论(0编辑  收藏  举报