题目大意:给出一个地图,‘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; }