广度优先-BFS

介绍

以广度为准,先访问从岔道能直接到达的所有结点,然后再按这些结点被访问顺序访问它们能直接到达的结点,直至全部遍历完。

求矩阵中元素上下左右均为1所组成的块的数目

#include <iostream>
#include <queue>
using namespace std;
const int maxn=100;
int x,y;
int str[maxn][maxn];//矩阵
bool enter[maxn][maxn]={false};//是否已入队
struct node{//结点位置int x;int y;
}nodes;
//两个数组分别表示上下左右移动
int str1[]={0,0,-1,1};
int str2[]={1,-1,0,0};
//判断是否需要访问
bool judge(int a,int b){if(a<0||a>x||b<0||b>y)//越界return false;if(enter[a][b]==true||str[a][b]==0)//已被入过队或访问值不为1,return false;return true;
}
void BFS(int x,int y){queue<node> q;nodes.x=x;nodes.y=y;q.push(nodes);enter[x][y]=true;while(!q.empty()){nodes=q.front();q.pop();for(int i=0;i<4;i++){//看其上下左右是否满足条件int newX=nodes.x+str1[i];int newY=nodes.y+str2[i];if(judge(newX,newY)){nodes.x=newX;nodes.y=newY;q.push(nodes);//满足就入队enter[newX][newY]=true;//表示已入队}}}
}
int main(){int count=0;cin>>x>>y;for(int i=0;i<x;i++)for(int j=0;j<y;j++)cin>>str[i][j];for(int i=0;i<x;i++)for(int j=0;j<y;j++){if(enter[i][j]==false&&str[i][j]==1){count++;BFS(i,j);}}cout<<count<<endl;return 0;
}

走迷宫:’ * ‘表示墙,’ . '表示平地,只能上下左右移动,求由起点出发到达终点的最少步数。

#include <iostream>
#include <queue>
using namespace std;
const int maxn=100;
int x,y,count=0;
char str[maxn][maxn];
struct node{int x;int y;int step;//记录每个位置下的步数
}b,e;
node nodes;//临时结点
bool enter[maxn][maxn]={false};
int str1[]={0,0,-1,1};
int str2[]={1,-1,0,0};
bool judge(int a,int b){//判断是否为有效位置if(a<0||a>=x||b<0||b>=y) return false;if(enter[a][b]==true)//已入过return false;if(str[a][b]=='*')//墙return false;return true;
}
int BFS(){queue<node> q;q.push(b);while(!q.empty()){node top=q.front();q.pop();if(top.x==e.x&&top.y==e.y)return top.step;//到达终点返回步数for(int i=0;i<4;i++){int newX=top.x+str1[i];int newY=top.y+str2[i];if(judge(newX,newY)){//判断新元素是否为有效位置nodes.x=newX;nodes.y=newY;nodes.step=top.step+1;//找到一个步数++q.push(nodes);enter[newX][newY]=true;}}}return -1;
}
int main(){cin>>x>>y;//对输入的处理for(int i=0;i<x;i++){getchar();//去掉每行中的换行符for(int j=0;j<y;j++){str[i][j]=getchar();}str[i][y+1]='\0';//手动添加结束符}cin>>b.x>>b.y>>e.x>>e.y;b.step=0;cout<<BFS()<<endl;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

写点技术人员离职的心得

离职的心态 人们在辞退或者被辞退都会对原公司抱有意见&#xff0c;因为疫情&#xff0c;公司业务告急&#xff0c;工资发不出来&#xff0c;我也失去了工作。虽然情绪上难免会有波动&#xff0c;但是转念一想&#xff0c;我应该用开心的心态来看待这次辞职&#xff0c;并希望…

Linux之JAVA环境配置jdkTomcatMySQL

目录 一. 安装jdk 1.1 查询是否有jdk 1.2 解压 1.3 配置环境变量 二. 安装Tomcat&#xff08;开机自启动&#xff09; 2.1 解压 2.2 启动tomcat 2.3 防火墙设置 2.4 创建启动脚本&#xff08;设置自启动&#xff0c;服务器开启即启动&#xff09; 三. MySQL安装&#xff08;…

vscode使用restClient实现各种http请求

vscode使用restClient实现各种http请求 一&#xff0c;安装插件 首先&#xff0c;我们要在vscode的扩展中&#xff0c;搜索rest Client&#xff0c;然后安装它&#xff0c;这里我已经安装过了。 安装后&#xff0c;我们就可以使用rest client插件进行http各种操作了。 二&…

Unity接入SQLite (二):SQL常用命令

在上一篇上《Unity接入SQLite (一):SQLite介绍-CSDN博客》中已经介绍了如何在Unity中接入SQLite插件&#xff0c;并且创建了一个db文件。如何进行数据库的读取&#xff0c;其中SQL命令非常重要 1.SQL支持的数据类型 SQL数据类型是用来定义数据库中存储的数据的类型&#xff0…

二分图匹配详解

二分图的原始模型及相关概念 二分图又称作二部图&#xff0c;是图论中的一种特殊模型。 设G(V,E)G(V,E)是一个无向图。 如顶点集V可分割为两个互不相交的子集&#xff08;A, B&#xff09;&#xff0c;并且图中每条边(i&#xff0c;j)所关联的两个顶点 i 和 j 就都分属两个不…

定时任务处理-Spring Task

目录 1 前言 2 cron表达式 2.1 相关概念的介绍 2.2 举个例子(白雪警告) 2.3 使用网站自动生成 3 Spring Task的使用 3.1 导入依赖坐标 3.2 开启任务调度 3.3 自定义定时任务类 1 前言 当我们需要处理一些定时任务的时候就需要用到我们的Spring Task&#xff0c;接下来…

(done) 两个矩阵 “相似” 是什么意思?

参考视频&#xff1a;https://www.bilibili.com/video/BV1zu411673J/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 参考资料&#xff1a;https://baike.baidu.com/item/%E7%9B%B8%E4%BC%BC%E7%9F%A9%E9%98%B5/10369874?frge_a…

算能RISC-V通用云编译飞桨paddlepaddle@openKylin留档

尝试一在riscv里编译飞桨。 先总结&#xff1a; 下载飞桨代码&#xff0c;参照pr修改代码 然后编译 cmake ../ -DWITH_GPUOFF -DWITH_RISCVON make -j 16 TARGETRISCV64_GENERIC 编译好后安装&#xff1a; pip install paddlepaddle-0.0.0-cp38-cp38-linux_riscv64.whl -…

Opencv(C++)学习 ARM上引用opencv报相关头文件找不到

简单问题记录&#xff0c;C 与C互相引用时应该多注意类似问题。 问题描述&#xff1a;在项目中&#xff0c;建立了一个interface.h提供了一个C语言兼容的接口void work()&#xff0c;并在对应的interface.cpp中使用OpenCV完成相关处理实现。在PC端测试时&#xff0c;main.cpp成…

【HTML/CSS/JavaScript-编程指南】

HTML/CSS/JavaScript-编程指南 ■ HTML/CSS/JavaScript简介■ HTML/CSS/JavaScript学习网站■ VScode■ VSCode编写HTML■ VSCode编写CSS■ VSCode编写JavaScript ■ 语法■ HTML语法■ CSS语法■ JavaScript 语法 ■ HTML/CSS/JavaScript简介 HTML&#xff08;全称 Hypertext…

小波变换模拟

小波变换是一种信号处理技术&#xff0c;通过在时间-频率域中使用基于小波的函数进行信号分析。小波变换在处理非平稳信号和图像时特别有用&#xff0c;可以将信号分解为不同频率的成分。它在数据压缩、去噪、特征提取等领域有广泛应用。 MATLAB中提供了用于二维离散小波变换的…

css4浮动+清除浮动

浮动 一.常见网页布局1.三种布局方式2.布局准则 二.浮动&#xff08;float&#xff09;1.好处2.概念3.三大特性4.使用5.常见网页布局模板6.注意点 三.清除浮动1.why2.本质3.语法4.四种way&#xff08;后三个都是给父级添加&#xff09;清除浮动总结 一.常见网页布局 1.三种布局…

终端启动jupyter notebook更换端口

一、问题描述 如果尝试在端口 8889 上启动 Jupyter Notebook 但最终启动在了 8890 端口&#xff0c;这通常意味着 8889 端口已经被占用。要解决这个问题&#xff0c;可以尝试以下几种方法来关闭占用 8889 端口的进程。 1. 查找并终止占用端口的进程 首先&#xff0c;需要找出…

课时45:表达式_表达式_字符串表达式

3.2.3 字符串表达式 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 所谓的字符串表达式&#xff0c;主要是判断 比较运算符 两侧的值的内容是否一致&#xff0c;由于bash属于弱类型语言&#xff0c;所以&#xff0c;默认情况…

【课程作业】提取图中苹果的面积、周长和最小外接矩形的python、matlab和c++代码

提取图中苹果的面积、周长和最小外接矩形 在图像处理中&#xff0c;提取对象的关键属性是常见的任务之一。本文将演示如何使用三种流行的编程语言——Python、Matlab和C&#xff0c;利用相应的图像处理库&#xff08;OpenCV或Matlab内置函数&#xff09;来提取图像中苹果的面积…

Java8 Stream API 详解:流式编程进行数据处理

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

切比雪夫(最小区域法)平面拟合算法

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 本期话题&#xff1a;切比雪夫&#xff08;最小区域法&#xff09;平面拟合算法 相关背景和理论 点击前往 主要介绍了应用背景和如何转化成线性规划问题 平拟合输入和…

Vue2:多级路由案例

一、情景说明 上一节&#xff0c;我们学习了Vue中的路由功能 但是&#xff0c;只是基础的一级路由 在实际生产中&#xff0c;路径不可能只有一级&#xff0c;一般都有3,4层级 二、案例 1、修改路由器文件 index.js 新增两个组件 这里实现二级路由配置 关键配置&#xff1a;…

命题逻辑|析取、合取和蕴含到底什么意思

如是我闻&#xff1a;在逻辑学中&#xff0c;“析取”、“合取”和“蕴含”这些术语的中文翻译是有其逻辑和哲学基础的&#xff0c;它们准确地反映了这些逻辑操作的本质。虽然他们被翻译的很高级&#xff0c;但并不能让人一下子就明白。 析取 (Disjunction) 原理&#xff1a;…

【C++精简版回顾】8.const

1.const数据成员 &#xff08;1&#xff09;const数据成员必须使用初始化参数列表 &#xff08;2&#xff09;不能修改 &#xff08;3&#xff09;不能修改必须初始化 class MM { public:MM() {}MM(int age, string name) :age(age), name(name) {}~MM() {cout << "…