题目描述:
小明来到了北极,见到了美丽的极光。
极光是一个n行m列的二维数组,有些点发光,有些点不发光,小明想知道极光中有多少个图案。
如果两个发光点的距离小于等于2,那么这两个点属于同一个图案。
我们定义两个点P(x1,y1),点Q(x2,y2)的距离为abs(x1-x2)+abs(y1-y2)。
输入:
第一行,两个数n和m,表示行和列。
第2行到第n+1行,每行m个字符。如果字符为#,表示发光,其他字符表示不发光。
输出:
一个行,一个数表示图案个数。
样例输入:
19 48 ------------------------------------------------ ---####-----#-----#----------------------####--- --######----#-----#---------------------######-- -########--#-#---#-#####--#-##-##---#--########- -###--###--#-#---#-#----#-##-##--#--#--###--###- -###--###--#--#-#--######-#--#---#-#---###--###- -########--#--#-#--#------#--#----##---########- --######---#---#---######-#--#-----#----######-- ---####----------------------------#-----####--- ----------------------------------#------------- ------------------------------------------------ ---###--#--------#------#----------------------- --#---#-#---------------#----------------------- -#------#-##--#-##--##-###-#-##-###--###-#--##-- -#------##--#-##-#-#----#--##--#---##---##-#---- -#------#---#-#--#--#---#--#---#---##----#--#--- --#---#-#---#-#--#---#--#--#---#---##---##---#-- ---###--#---#-#--#-##---#--#---#---#-###-#-##--- ------------------------------------------------
样例输出:
4
数据范围:
1<=n,m<=100
以下是代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
char maps[105][105];
int dir[12][2]={0,1,0,-1,1,0,-1,0,-2,0,-1,-1,-1,1,0,2,0,-2,1,-1,1,1,2,0};
struct data{
int x;
int y;
};
queue<data> q;
void BFS(int x,int y){
q.push((data){x,y});
maps[x][y]='-';
while(!q.empty()){
data head=q.front();
q.pop();
for(int i=0;i<12;i++){
int nx=head.x+dir[i][0];
int ny=head.y+dir[i][1];
if(nx>=1&&ny>=1&&nx<=n&&ny<=m&&maps[nx][ny]=='#'){
maps[nx][ny]='-';
q.push((data){nx,ny});
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>maps[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(maps[i][j]=='#'){
ans++;
BFS(i,j);
}
}
}
cout<<ans;
return 0;
}
如有疑问,可以在下方评论中提出哦~
小编会尽量解决你的问题。

被折叠的 条评论
为什么被折叠?



