赞
踩
单点时限: 2.0 sec
内存限制: 256 MB
我仰望星空,
它是那样辽阔而深邃;
那无穷的真理,
让我苦苦地求索、追随。
我仰望星空,
它是那样庄严而圣洁;
那凛然的正义,
让我充满热爱、感到敬畏。
我仰望星空,
它是那样自由而宁静;
那博大的胸怀,
让我的心灵栖息、依偎。
我仰望星空,
它是那样壮丽而光辉;
那永恒的炽热,
让我心中燃起希望的烈焰、响起春雷。
星空有无数星座,而今天就请你数一数天空有多少星座。
假设天空为 wh 的平面,星座由相邻的星星组成。两颗星相邻的条件为横向或纵向或对角相连。如下图为 105 的天空:
…*
…***
.……
…*.
…*.
星星为 ’*’, 空白的部分为 ’.’,上图星空共有 2 个星座。
输入格式
第 1 行:两个由空格分开的整数,1<=w<=80 和 1<=h<=1000.
第 2 到 h+1 行:每一行包含 w 个 ’*’ 或者 ’.’,代表星空的组成。
输出格式
一行:表示当前星空星座的个数。
样例
input
10 5
……**
.…***
.……
….
….
15 8
.……*
….**.……
....
…...
…….…
……
…………
.…...
output
2
7
/* 思路:bfs求连通块数 */ #include<iostream> #include<queue> #include<cstring> using namespace std; struct g { int x,y; }; int x[8]= {1,-1,0,0,1,-1,1,-1}; int y[8]= {0,0,1,-1,1,-1,-1,1}; int w,h; int visit[1000][2000]; char s[1000][2000]; bool text(int a,int b) { if(a<0||b<0||a>=h||b>=w||visit[a][b]||s[a][b]=='.') return false; return true; } void bfs(int a,int b) { g d; d.x=a; d.y=b; visit[a][b]=1; queue<g>q; q.push(d); while(!q.empty()) { g f = q.front(); q.pop(); for(int i = 0; i < 8; i++) { a=f.x+x[i]; b=f.y+y[i]; if(text(a,b)) { g t; t.x=a; t.y=b; visit[a][b]=1; q.push(t); } } } } int main() { while(cin>>w>>h) { memset(visit,0,sizeof(visit)); for(int i = 0; i < h; i++) { for(int j = 0; j < w; j++) cin>>s[i][j]; } int ans=0; for(int i =0; i < h; i++) { for(int j = 0; j < w; j++) { if(s[i][j]=='*'&&visit[i][j]==0) { bfs(i,j); ans++; } } } cout<<ans<<endl; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。