题意:要数出池塘的数量,‘W’表示水,‘.’表示陆地。
思路:2个for循环遍历一遍,每一次选择是 ‘W’ 且没被访问过的进行BFS搜索,搜索时可以走8个方向。
int dir[8][2]={{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};
源代码:
#include<stdio.h> #include<string.h> int n,m,i,j,k,num,front,rear; char data[205][205]; int vis[205][205]; int dir[8][2]={{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}}; struct ED { int x,y; }queue[10005],e; void bfs() { int i,j,xx,yy; num=0; for(i=0;i<n;i++) for(j=0;j<m;j++) if(vis[i][j]==0&&data[i][j]=='W') { front=rear=0; queue[front].x=i; queue[front].y=j; while(front<=rear) { xx=queue[front].x; yy=queue[front].y; front++; for(int l=0;l<8;l++) { e.x=xx+dir[l][0]; e.y=yy+dir[l][1];; if(vis[e.x][e.y]==0 && data[e.x][e.y]=='W' &&
e.x>=0 && e.x<n && e.y>=0 && e.y<m) { ++rear; queue[rear]=e; vis[e.x][e.y]=1; } } } num++; } printf("%d\n",num); } int main() // Lake Counting { while(scanf("%d%d",&n,&m)!=EOF) { memset(vis,0,sizeof(vis)); memset(data,-1,sizeof(data)); memset(queue,-1,sizeof(queue)); getchar(); for(i=0;i<n;i++) scanf("%s",data[i]); bfs(); } return 0; }