题意:要数出池塘的数量,‘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;
}