仰望星空
Time Limit:1000MS Memory Limit:65536KB
Total Submit:373 Accepted:145
Description
我仰望星空,
它是那样辽阔而深邃;
那无穷的真理,
让我苦苦地求索、追随。
我仰望星空,
它是那样庄严而圣洁;
那凛然的正义,
让我充满热爱、感到敬畏。
我仰望星空,
它是那样自由而宁静;
那博大的胸怀,
让我的心灵栖息、依偎。
我仰望星空,
它是那样壮丽而光辉;
那永恒的炽热,
让我心中燃起希望的烈焰、响起春雷。
星空有无数星座,而今天就请你数一数天空有多少星座。
假设天空为w*h的平面,星座由相邻的星星组成。两颗星相邻的条件为横向或纵向或对角相连。如下图为10*5的天空:
..*.....**
.**..*****
.*...*....
..****.***
..****.***
星星为’*’,空白的部分为’.’,上图星空共有2个星座。
Input
第1行:两个由空格分开的整数,1<=w<=80和1<=h<=1000.
第2到h+1行:每一行包含w个’*’或者’.’,代表星空的组成。
Output
一行:表示当前星空星座的个数。
Sample Input
10 5
..*.....**
.**..*****
.*...*....
..****.***
..****.***
15 8
**.**......*..*
..*.**.*...*...
*.*.**.*****.**
...***.****.**.
...**..*.*.....
*****..*****..*
....**...*..*..
*.*...*.*.*.***
Sample Output
2
7
Source
解题:搜索
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <bits/stdc++.h> 2 #define pii pair<int,int> 3 using namespace std; 4 int w,h; 5 char table[1010][90]; 6 const int dir[8][2] = { 7 -1,0,1,0,0,-1,0,1, 8 -1,-1,1,1,-1,1,1,-1 9 }; 10 bool isIn(int x,int y) { 11 return x >= 0 && x < h && y >= 0 && y < w; 12 } 13 queue< pii >q; 14 void bfs(int x,int y) { 15 while(!q.empty()) q.pop(); 16 q.push(pii(x,y)); 17 table[x][y] = '.'; 18 while(!q.empty()) { 19 pii now = q.front(); 20 q.pop(); 21 for(int i = 0; i < 8; ++i) { 22 x = now.first + dir[i][0]; 23 y = now.second + dir[i][1]; 24 if(isIn(x,y) && table[x][y] == '*') { 25 q.push(pii(x,y)); 26 table[x][y] = '.'; 27 } 28 } 29 } 30 } 31 int main() { 32 while(~scanf("%d%d",&w,&h)) { 33 for(int i = 0; i < h; ++i) 34 scanf("%s",table[i]); 35 int ret = 0; 36 for(int i = 0; i < h; ++i) { 37 for(int j = 0; j < w; ++j) { 38 if(table[i][j] == '*') { 39 ret++; 40 bfs(i,j); 41 } 42 } 43 } 44 printf("%d\n",ret); 45 } 46 return 0; 47 }