题目就不贴了;只不过,要注意将队列开大一点,我第一次开了500,结果RunTimeError了……我一狠心开了10000呵呵
#include<stdio.h> struct Node { int x; int y; }queue[10000]; int N, M; char map[101][101]; int visited[101][101]={0}; int ax[8]={-1, 1, 0, 0, -1, 1, -1, 1}; int ay[8]={0, 0, -1, 1, -1, -1, 1, 1}; void BFS(int y, int x)//i对应y, j对应x,横坐标为x, 纵坐标为y { int i, X, Y; int front=0, rear=1; queue[front].x=x; queue[front].y=y; visited[y][x]=1;//标记 while( front != rear)//当队列非空 { for(i=0; i<8; i++) { X=queue[front].x+ax[i]; Y=queue[front].y+ay[i]; if( visited[Y][X] != 1 && (X>=1&&X<=M) &&(Y>=1&&Y<=N) )//未越界且未访问过,入队列 { queue[rear].x=X; queue[rear].y=Y; visited[Y][X]=1;//标记 rear++; } } front++;//出队列 } } int main() { int i, j; int num=0; scanf("%d %d", &N, &M); for(i=1; i<=N; i++) { getchar();//接受换行符 for(j=1; j<=M; j++) { scanf("%c",&map[i][j]); if( map[i][j]=='.')//将没水的地方标记已为访问过 visited[i][j]=1; } } for(i=1; i<=N; i++) { for(j=1; j<=M; j++) { if(!visited[i][j] )//有水,且未访问过 { num++; BFS(i, j); } } } printf("%d\n", num); }