1329 【例8.2】细胞
法一:DFS!!(详细看注释)
#include<bits/stdc++.h>
using namespace std;
int n,m;//行列
char mp[70][70];//地图
int next[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//方向
int ans=0;//答案
void pr(){//测试函数
cout<<"--------------"<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<mp[i][j];
}
cout<<endl;
}
}
void dfs(int x,int y){
mp[x][y]='0';
for(int i=0;i<4;i++){
int nx=x+next[i][0];
int ny=y+next[i][1];
if(nx>=0 && nx<n && ny>=0 && ny<m && mp[nx][ny]!='0'){
// pr();
// cout<<endl;
dfs(nx,ny);
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>mp[i][j];
}
}
// pr();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]!='0'){//当不为‘0’时开始遍历
ans++;
dfs(i,j);//从当前位置开始遍历
}
}
}
cout<<ans<<endl;
return 0;
}
法二:BFS!!
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
}que[3610];//结构体,方便记录同一个点的横纵坐标
int fx[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//方向
char mp[70][70]={0};//地图
int ans=0;//细胞个数
int f,r;//队首,队尾
int n,m;//行列
void pr(){//测试函数
cout<<"--------"<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<mp[i][j];
}
cout<<endl;
}
}
void bfs(int x,int y){
f=r=1;//初始化队列
que[r].x=x , que[r].y=y , mp[x][y]='0';//将初始位置插入队列,并将当前位置改为已访问
while(f<=r){
node t;
t.x=que[f].x , t.y=que[f].y;//设立新结构体,记录队首横纵坐标
for(int i=0;i<4;i++){
int nx=t.x+fx[i][0];//下一个位置的横坐标
int ny=t.y+fx[i][1];//下一个位置的纵坐标
if(nx>=0 && nx<n && ny>=0 && ny<m && mp[nx][ny]!='0'){//约束条件
mp[nx][ny]='0';//将当前位置更改为‘0’
// pr();
r++;//为入队做准备
que[r].x=nx;
que[r].y=ny;
}
}
f++;//队首出队
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++) cin>>mp[i];
// pr();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]!='0'){
ans++;//只要不是‘0’,答案就+1;
bfs(i,j);
}
}
}
cout<<ans<<endl;
return 0;
}