1329:【例8.2】细胞 广度优先搜索

1329:【例8.2】细胞

时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
一矩形阵列由数字0
到9组成,数字1到9
代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:
4 10
0234500067
1034560500
2045600671
0000000089
有4个细胞。

【输入】
第一行为矩阵的行n和列m;
下面为一个n×m的矩阵。
【输出】
细胞个数。

【输入样例】
4 10
0234500067
1034560500
2045600671
0000000089
【输出样例】
4

解析:
题意可知:只要是上下左右相邻都是不为0数字,即为同一种细胞(我第一次读以为只有上下左右有数字不为0,才能算一种细胞emmmm傻狗

如果把该二位数组每个位置视为节点,则题目思路如下:

  • 可以用深度优先算法:从第一个节点开始遍历,然后分别判断其上下左右是否有相邻的。dfs的精髓就是每次再判断这个节点的数的‘邻居’是否其相邻是同一细胞时,只要是,就立即dfs该‘邻居’,,继续dfs,直到判断完成,又回溯到上一个节点,判断其上下左右。

  • 也可以用广度优先算法:从一个节点开始遍历,然后分别判断其上下左右是否是同一种细胞,如果是,则上下左右判断完后,再判断该节点的上下左右(即该节点的上面一个节点)

    • 而表示这个遍历了上下左右后再回到该节点就需要用到队列(先进先出)
    • 可以用一个结构体队列,将下标(x,y)遍历时入队,然后判断四个方向,如果是同一种细胞则压入队列,四个方向遍历完后,回到队列头部,将其出队(q.pop()),然后又从队头开始去判断其四个方向,,,,直到该队列为空,说明这一种细胞已经搜索完了(由于队列的顺序性,也可以不用结构体数组,直接分别将x,y分别压入队列,在获取到队头的x后,及时Pop(),也可以通过q.front()拿到y,所以可以不用结构体数组)
  • 不管是哪个搜索,都可以在搜索到一个节点时,及时标注(用一个数组去记录是否访问过),减少遍历时间。由于此题特殊,可以直接将数组值设为0,也可以在搜索完成后不会出现二次遍历的情况

代码示例:

深度优先搜索

//深搜-样例比较小时可以用 
#include<bits/stdc++.h>
using namespace std;
#define N 101
int n,m,num;
char a[N][N];
int dx[4]={-1,1,0,0};  //上、下、左、右四个方向 
int dy[4]={0,0,-1,1};
void dfs(int x,int y);
int main()
{
	cin>>n>>m; 
	for(int i=0;i<n;i++)
		scanf("%s",&a[i]);
	//遍历每个元素,用标记数组标记已经访问过的,则可以避免二次遍历 ,减缩短运行时间 
	for(int i=0;i<n;i++)
	{
        for(int j=0;j<m;j++)
		{
            if(a[i][j]!='0')
			{
                num++;    //没被访问过说明是新的不同的细胞 
                dfs(i,j); //搜索这一元素的四个方向
            }
        }
    }
   cout<<num;
	return 0;
}
void dfs(int x,int y)
{
	a[x][y]='0';//为0即也表示该细胞已经访问过了 
	int newx,newy;
	for(int i=0;i<4;i++)
	{
		newx=x+dx[i];
		newy=y+dy[i];
		//首先保证在边界内,其次保证他是细胞,最后保证他是未被访问过的 ,都满足即可继续访问其周围的细胞 
		if(newx<n && newx>=0 && newy<m && newy>=0&&a[newx][newy]!='0')  
        {
                dfs(newx,newy);
        }
	}
}

广度优先搜索

//广搜 
#include<bits/stdc++.h>
using namespace std;
#define N 101
int n,m,num;
char a[N][N];
int dx[4]={-1,1,0,0};  //上、下、左、右四个方向 
int dy[4]={0,0,-1,1};	
queue<int>q;//数据类型为int的队列 -先进先出 
void bfs(int x,int y);
int main()
{
	cin>>n>>m; 
	for(int i=0;i<n;i++)
		scanf("%s",&a[i]);
	for(int i=0;i<n;i++)
	{
        for(int j=0;j<m;j++)
		{
            if(a[i][j]!='0')
			{
                num++;    //没被访问过说明是新的不同的细胞 
                bfs(i,j); //搜索这一元素的四个方向
            }
        }
    }
   cout<<num;
	return 0;
}
void bfs(int x,int y)
{
	a[x][y]='0';//表示访问过 ,在这里不会影响入队后的周围细胞的判断,因为一次bfs就完成了同一个细胞的问题 
	q.push(x),q.push(y);//将下标分别压入队列(属于同一个细胞队列) 
	int newx,newy;
	//同一个细胞队列,先拿到队列的数据,出队处理,然后一次访问四个方向(立即出队便于后面同一种细胞进来,保证每次循环处理的是新一个细胞) 
	while(!q.empty()){
		int nx=q.front();  
		q.pop();
		int ny=q.front();
		q.pop();
		for(int i=0;i<4;i++){
		    newx=nx+dx[i],newy= ny+dy[i];
			if(newx<n && newx>=0 && newy<m && newy>=0&&a[newx][newy]!='0') {
               //继续压入栈(是同一个细胞)
			   q.push(newx);
			   q.push(newy);
			   a[newx][newy]='0';//只是压入同一个细胞的栈,不会继续搜索,所以要标记为以访问,避免重复访问 
      		 }
		}
	} 
	
}
深度优先算法BFS是一种图像搜索演算法,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,主要借助一个队列、一个布尔类型数组、邻接矩阵完成**。
从图像来看,他是先一个节点搜索所有的子节点遍历完毕后,再回到同层次的第一个的节点再次遍历其所有子节点。
在实际运用时,遍历子节点的过程实质是求完一个情况的所有相邻的解,再开始搜索下一个节点

以下是bfs和dfs的树遍历对比
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/300908.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22.04开机左上角下划线闪烁不开机

按下CtrlAltF2&#xff0c;打开TTY系统&#xff0c;然后通过用户名和密码登录&#xff0c;随后使用 sudo apt --fix-broken install 根据提示排除错误信息&#xff0c;然后使用apt安装lightdm安装就行。 tips:当使用EasyConnect的时候&#xff0c;你可能参考了下面这篇文章知…

Open CASCADE学习|Draw Harness

目录 显示长方体 提供帮助信息 执行文件 记录交互式命令 使用getsourcefile可以快速查找到Tcl命令对应的C源文件 在Tcl中内置了一些变量&#xff0c;并赋予了一定的功能。内置变量列表如下&#xff1a; 退出 加载插件 在屏幕显示变量 返回绘图变量信息 视图 mu, md…

Linux程序、进程和计划任务

目录 一.程序和进程 1.程序的概念 2.进程的概念 3.线程的概念 4.单线程与多线程 5.进程的状态 二.查看进程信息相关命令&#xff1a; 1.ps&#xff1a;查看静态进程信息状态 2.top&#xff1a;查看动态进程排名信息 3.pgrep&#xff1a;查看指定进程 4.pstree&#…

大模型实战营Day2 作业

基础作业 1 使用 InternLM-Chat-7B 模型生成 300 字的小故事 2 熟悉 hugging face 下载功能&#xff0c;使用 huggingface_hub python 包&#xff0c;下载 InternLM-20B 的 config.json 文件到本地 进阶作业 1 完成浦语灵笔的图文理解及创作部署 2 完成 Lagent 工具调用 Demo…

shp文件与数据库(创建表)

前言 第三方库准备 shp文件是什么&#xff1f;笔者就不多做解释。后面将使用python的一些第三方库 1、sqlalchemy 2、pyshp 3、geoalchemy2 4、geopandas 这四个是主要的库&#xff0c;具体怎么使用可以参考相关教程&#xff0c;当然还有其他库&#xff0c;后面在介绍。…

C语言数据在内存中的存储

1.整数在内存中的存储 我们知道数据在内存中都是以2进制的形式存储的&#xff1b;比如int,char,double,float这些类型的数据都是以2进制的形式去存储的&#xff0c;那么这些数据又是如何去存入/取出的呢&#xff1f; 前面我们知道&#xff0c;整数分为有符号整数和无符号整数…

关键字、标志符、变量

1、关键字 1.1、定义 定义&#xff1a;被JAVA语言赋予了特殊含义&#xff0c;用作专门用途的字符串&#xff08;或单词&#xff09; 特点&#xff1a;全部关键字都是小写字母 上源码&#xff1a; 代码中定义类的关键字class&#xff0c;定义一个订单控制器类 ​​​​​​​…

搭建React开发环境-webpack实现

周末在家学会React前端知识&#xff0c;记录下来&#xff0c;方便备查。 webpack版本&#xff1a;webpack5 编译器&#xff1a;vscode 第一步、新建项目及初始化 1&#xff09;新建项目文件夹 可命名为 my_webpack 2&#xff09;初始化项目 使用命令 npm init -y&#xff0c;…

Android getApplication()、getApplicationContext的区别

在Android中&#xff0c;getApplication()和getApplicationContext()是两种获取应用程序上下文的方法&#xff0c;但它们有一些细微的区别。 getApplication()方法&#xff1a; getApplication()方法通常用于Activity或Fragment中&#xff0c;它返回当前Activity或Fragment所属…

深度学习:解决CNN的困境——胶囊网络

从2017年底到2018年初&#xff0c;整个人工智能学术研究领域谈论最多的应该就是被誉为深度学习之父Geoffrey E. Hinton 发表的论文 Dynamic Routing Between Capsules,其中介绍了全新的深度学习模型——胶囊网络&#xff08;Capsule Network&#xff09; 1. 普通CNN的困境 虽…

电子学会C/C++编程等级考试2023年12月(三级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:因子问题 任给两个正整数N、M,求一个最小的正整数a,使得a和(M-a)都是N的因子。 时间限制:10000 内存限制:65536 输入 包括两个整数N、M。N不超过1,000,000。 输出 输出一个整数a,表示结果。如果某个案例中满足条件的正整数不存…

YOLOv5改进 | 主干篇 | CSWinTransformer交叉形窗口网络改进特征融合层

一、本文介绍 本文给大家带来的改进机制是CSWin Transformer,其基于Transformer架构,创新性地引入了交叉形窗口自注意力机制,用于有效地并行处理图像的水平和垂直条带,形成交叉形窗口以提高计算效率。它还提出了局部增强位置编码(LePE),更好地处理局部位置信息,我将其…

新手练习项目 5:简易计算器(C++)

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#xff09; 目录 一、效果图二、代码&#xff08;带注释&#xff09;三、说明 一、效果图 二、代码&#xff08;带…

【Spring实战】26 使用Spring Security 保护 Spring Boot Admin

文章目录 1. 定义1.集成流程1&#xff09;添加 Spring Boot Admin 依赖2&#xff09;配置 Spring Boot Admin3&#xff09;启动 Spring Boot Admin 服务4&#xff09;访问 Spring Boot Admin 服务5&#xff09;添加 Spring Security 依赖6&#xff09;配置 Spring Security7&am…

计算机网络实验(二):Wireshark网络协议分析

一、实验名称&#xff1a;Wireshark网络协议分析 二、实验原理 HTTP协议分析 1.超文本传输协议&#xff08;Hypertext Transfer Protocol, HTTP&#xff09;是万维网&#xff08;World Wide Web&#xff09;的传输机制&#xff0c;允许浏览器通过连接Web服务器浏览网页。目…

CAN物理层协议介绍

目录 ​编辑 1. CAN协议简介 2. CAN物理层 3. 通讯节点 4. 差分信号 5. CAN协议中的差分信号 1. CAN协议简介 CAN是控制器局域网络(Controller Area Network)的简称,它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO11519) &#xff0…

求更新后的路由表

假定网络中的路由器B的路由表有如下的项目 (这三列分别表示“目的网络“距离”和“下一跳路由器”): 现在B收到从C发来的路由信息(这两列分别表示“目的网络”和“距离”): 试求出路由器B更新后的路由表(详细说明每一个步骤)。 (1)首先把收到的路由信息的"距离"1: …

【AI视野·今日NLP 自然语言处理论文速览 第七十一期】Fri, 5 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 5 Jan 2024 Totally 28 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers LLaMA Pro: Progressive LLaMA with Block Expansion Authors Chengyue Wu, Yukang Gan, Yixiao Ge, Zeyu Lu, …

Fowsniff

靶场搭建 遇到扫描不到的情况&#xff0c;可以尝试改靶机的网络为NAT模式&#xff0c;在靶机启动时按”esc“&#xff0c;进入Advanced options for Ubantu&#xff0c;选择recovery mode&#xff0c;选择network&#xff0c;按方向键”→“&#xff0c;OK&#xff0c;然后res…

JVM工作原理与实战(九):类加载器-启动类加载器

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、启动类加载器 二、通过启动类加载器去加载用户jar包 1.放入jre/lib目录进行扩展 2.使用参数进行扩展 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字节码…