题目大意:给出一个地图,‘x’代表有效区域,‘.’代表空白区域,在给出鼠标点击的位置,求鼠标点击位置的有效区域的周长是多大
解决:BFS,关键是如何求周长的问题,由于一个‘x’,有四个面,如果该格子四周周围有n个面(只需统计四周,而不是八个方向都需要统计),
则这个‘x’的有效周长是4-n,
如何知道周围有多少个面,只需要在四个面遍历的时候记录下就行了,用了一个vis数组表示i,j这个地方有没有‘x’存在,vis数组是一直不变的
而BFS中访问过的用‘.’,以免重复访问。
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int m,n,sx,sy;
char map[25][25];
bool vis[25][25];
int dx[]={1,-1,0,0,1,-1,1,-1};
int dy[]={0,0,-1,1,1,-1,-1,1};
struct node
{
int x,y;
node(){}
node(int xx,int yy):x(xx),y(yy){}
};
void bfs(int x,int y)
{
queue<node> q;
q.push(node(x,y));
map[x][y]='.';
node t,tmp;
int i,sum=0,inc;
while(!q.empty())
{
t=q.front();
inc=0;
q.pop();
for(i=0;i<4;i++)
{
tmp=node(t.x+dx[i],t.y+dy[i]);
if(tmp.x>=0 && tmp.x <m && tmp.y>=0 && tmp.y<n )
{
if(vis[tmp.x][tmp.y])inc++;
if( map[tmp.x][tmp.y]=='X')
{
map[tmp.x][tmp.y]='.';
q.push(tmp);
}
}
}
sum+=4-inc;
for(;i<8;i++)
{
tmp=node(t.x+dx[i],t.y+dy[i]);
if(tmp.x>=0 && tmp.x <m && tmp.y>=0 && tmp.y<n && map[tmp.x][tmp.y]=='X')
{
map[tmp.x][tmp.y]='.';
q.push(tmp);
}
}
}
cout<<sum<<endl;
}
int main()
{
while(cin>>m>>n>>sx>>sy,m||n||sx||sy)
{
memset(vis,0,sizeof(vis));
for(int i=0;i<m;i++)cin>>map[i];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(map[i][j]=='X')vis[i][j]=1;
bfs(sx-1,sy-1);
}
system("pause");
return 0;
}