思路:bfs
代码:
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <map> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> using namespace std; #define mst(a,b) memset(a,b,sizeof(a)) #define eps 10e-10 #define PI acos(-1.0)//3.14159265 const int MAX_ = 1010; const int N = 100010; const int INF = 0x7fffffff; queue<int >q; bool vis[MAX_][MAX_]; char str[MAX_][MAX_]; int dir[8][2] = {{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1}}; int n,m; void bfs(int x,int y){ q.push(x); q.push(y); vis[y][x] = 1; while(!q.empty()){ int curx, cury; curx = q.front(); q.pop(); cury = q.front(); q.pop(); for(int i = 0 ; i < 8; ++i){ int nextx, nexty; nextx = curx + dir[i][0]; nexty = cury + dir[i][1]; if((nextx >= 0 && nextx < m) && (nexty >= 0 && nexty < n) && str[nexty][nextx] == '@'){ if(!vis[nexty][nextx]){ vis[nexty][nextx] = 1; q.push(nextx); q.push(nexty); } } } } } int main(){ int ans; while(scanf("%d%d",&n,&m), n||m){ for(int i = 0; i < n; ++i){ scanf("%s",str[i]); } mst(vis,0); while(!q.empty())q.pop(); ans = 0; for(int i = 0; i < n; ++i){ for(int j = 0; j < m; ++j){ if(str[i][j] == '@' && !vis[i][j]){ bfs(j,i); ans++; } } } printf("%d\n",ans); } return 0; }