#include
#include
const int MAX=105;
using namespace std;
typedef struct node
{
int x,y;
int num;
}N;
int h,w;
char map[MAX][MAX];
bool visited[MAX][MAX];
int dir2[6][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{0,-1}};//偶数行,右边
int dir1[6][2]={{-1,0},{0,1},{1,0},{1,-1},{0,-1},{-1,-1}};//奇数行,左边
int bfs(int x,int y,int num)//搜连通
{
queueQ;
N cur,pre;
pre.x=x,pre.y=y;
if(visited[pre.x][pre.y]==true)
return 0;
visited[pre.x][pre.y]=true;
Q.push(pre);
while(!Q.empty())
{
pre=Q.front();
Q.pop();
if(pre.x%2)//奇数行
{
for(int i=0;i<6;i++)
{
cur=pre;
cur.x+=dir1[i][0];
cur.y+=dir1[i][1];
if(cur.x>=1 && cur.x<=h && cur.y>=1 && cur.y<=w
&& visited[cur.x][cur.y]==false && map[cur.x][cur.y]!='E' && map[cur.x][cur.y]!='\0')
{
visited[cur.x][cur.y]=true;
num++;
Q.push(cur);
}
}
}
else//偶数行
{
for(int i=0;i<6;i++)
{
cur=pre;
cur.x+=dir2[i][0];
cur.y+=dir2[i][1];
if(cur.x>=1 && cur.x<=h && cur.y>=1 && cur.y<=w
&& visited[cur.x][cur.y]==false && map[cur.x][cur.y]!='E' && map[cur.x][cur.y]!='\0')
{
visited[cur.x][cur.y]=true;
num++;
Q.push(cur);
}
}
}
}
return num;
}
int bfs1(int x,int y,int num)//先搜射击的地方
{
queueQ;
N cur,pre;
pre.x=x,pre.y=y;
pre.num=1;
visited[pre.x][pre.y]=true;
Q.push(pre);
char ch=map[pre.x][pre.y];
while(!Q.empty())
{
pre=Q.front();
Q.pop();
if(pre.x%2)//奇数行
{
for(int i=0;i<6;i++)
{
cur=pre;
cur.x+=dir1[i][0];
cur.y+=dir1[i][1];
if(cur.x>=1 && cur.x<=h && cur.y>=1 && cur.y<=w
&& visited[cur.x][cur.y]==false && map[cur.x][cur.y]==ch && map[cur.x][cur.y]!='\0')
{
visited[cur.x][cur.y]=true;
num++;
Q.push(cur);
}
}
}
else//偶数行
{
for(int i=0;i<6;i++)
{
cur=pre;
cur.x+=dir2[i][0];
cur.y+=dir2[i][1];
if(cur.x>=1 && cur.x<=h && cur.y>=1 && cur.y<=w
&& visited[cur.x][cur.y]==false && map[cur.x][cur.y]==ch && map[cur.x][cur.y]!='\0')
{
visited[cur.x][cur.y]=true;
num++;
Q.push(cur);
}
}
}
}
return num;
}
void init()
{
memset(visited,false,sizeof(visited));
}
int main(void)
{
int x,y;
while(scanf("%d%d%d%d",&h,&w,&x,&y)==4)
{
int shoot_num,tal=0;
for(int i=1;i<=h;i++)
{
scanf("%s",map[i]+1);
if(i%2==0)
{
map[i][w]='E';
map[i][w+1]='\0';
}
for(int j=1;j<=w;j++)
if(map[i][j]!='E')
tal++;
}
init();
shoot_num=bfs1(x,y,1);
if(shoot_num<3)
{
memset(visited,false,sizeof(visited));//如果射击不中的,都标志为false
}
int temp=0,remainder=0;
for(int j=1;j<=w;j++)
{
if(visited[1][j]==false && map[1][j]!='E')
{
temp=bfs(1,j,1);//搜连通,即掉落的个数
remainder+=temp;
}
}
int explode=0;
explode=tal-remainder;
printf("%d\n",explode);
}
return 0;
}
相关文章: