宝纸们它来咯
有人初学广搜有点不理解
SO!一个例题来嗦嗦叭!
读题!
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
输入:
第一行为矩阵的行n和列m;
下面为一个n×m的矩阵
输出:
细胞个数
看看代码!
#include<bits/stdc++.h>//万能头
#include<queue>// 如果不能用万能头就要单独写一个这个它能启用队列这个什么
using namespace std;
//广搜解决图的连通块问题
变量开全局
const int N=1e3+10;
char a[N][N];// 定义一个char类型的 a数组,用来存储
bool vis[N][N];// 定义一个bool类型的vis数组,用来标记
int n/*行*/, m/*列*/, ans/*计数*/;
结构体
struct point{
int x,y;// 定义结构体变量
};int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};// 定义方位数组void bfs(point start){
queue<point> q;// 定义 q队列
q.push(start);// 将 start 放入队列中
vis[start.x][start.y]=1;// 标记
while(!q.empty()){
point cur=q.front();// 定义一个变量 cur,使它变成队头元素
q.pop();
for(int i=0;i<4;i++){
point nxt;// 定义一个变量 nxt
nxt.x=cur.x+dx[i],nxt.y=cur.y+dy[i];
if(nxt.x<1||nxt.x>n||nxt.y<1||nxt.y>m) continue;
if(a[nxt.x][nxt.y]!='0'/*a[nxt.x][nxt.y]=='1'*/ && !vis[nxt.x][nxt.y]/*vis[nxt.x][nxt.y]==0*/)
q.push(nxt);
vis[nxt.x][nxt.y]=1;// 注意咯!要标记
}
}
}
主函数
int main(){
cin>>n>>m;// 输入 n行m列
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];// 循环输入 a数组
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]!='0'/*a[i][j]=='1'*/ && !vis[i][j]/*vis[i][j]==0*/){
ans++;
bfs({i,j});// 进入广搜
}
}
}
cout<<ans<<endl;// 输出 ans 就完啦
}
嘿嘿好啦(爱心
(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤