信息学奥赛一本通 滴 1329_细胞!

宝纸们它来咯

有人初学广搜有点不理解

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ᵒᵛᵉᵧₒᵤ❤

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值