当前位置: 首页 > news >正文

算法学习(22)—— BFS解决最短路问题

关于最短路问题

  • 最短路问题是“图论”里非常重要的一类问题,涉及的内容非常多,在这个专题里,我们主要讲“边权为1的最短路问题”,因为这个比较基础比较简单
  • 而关于啥是“边权为1的最短路问题”,我们通过下面的例子来讲解一下
  • 以上图为例,假设我们要求A点到I点的最短路程,解法特别固定也特别简单,就是“从起点开始,来一次BFS即可”;BFS需要两个东西:一个队列queue;一个是哈希表hash,来标记一个位置是否已经被访问过了
  • 先把A扔队列里,哈希表标记一下,然后发现A能到达B和C,就把B和C扔队列里,哈希表再标记一下;然后下一步也是最重要的一步
  • 我们先计算下队列的长度,我们直接循环两次,直接把B和C弹出,直接把B和C相通的D和E加入到队列里,虽然有先后顺序但是我们可以理解为同时扩展
  • 然后扩展D的时候,E已经被哈希表标记过了,E就不再加入到队列里了,因为E后面的路径是一样的,所以没必要在遍历一次E
  • 最后就是遍历到F点和G点时,由于F点直接扩展到I了,终点已经找到,所以直接结束,返回结果即可,所以找到的最短路就是“A-->C-->E-->F-->I

问题:为什么第一次碰到终点时就可以宣布找到最短路了呢?

解答: 感性理解下,A点到I点有4条路,假设有4个速度相同的人同时从起点A出发,由于速度相同,单位时间内可以看作4个人的移动距离是相同的,所以在这种情况下,谁先到达终点,那么这个人所花费的时间就是最少的,所以这个人走的这条路就是最短的

问题:如何找出最短路的长度呢?

解答: 由于权值为1,所有路径的长度都是相同的,所以扩展的层数再乘以权值就是最短路的长度

部分OJ题详解

1926. 迷宫中离入口最近的出口

1926. 迷宫中离入口最近的出口 - 力扣(LeetCode)

 

这是非常经典的一道迷宫问题,题目给我们一个二维数组和一维数组,二维数组中‘ + ’表示墙,‘ . '表示能走的空格子;第二个一维数组只有两个数,表示我们的起点;我们只能上下左右四个方向走,要我们找到能走出迷宫的最小步数,下面来分析下这道题:

注意事项

  • 我们的起点不能当作出口,如示例3
  • 出口的定义就是“与边界相连的空格就是出口”
  • 我们走到出口空格即可,不要走出去
  •  下面我们都以示例1为例,如下图:
  • 我们先把起点下标存一个队列里,然后根据队列里的下标循环做BFS遍历,一层一层往外扩展,当第一次扩展到出口时,根据扩展的层数就可以找到最短的路径
class Solution 
{int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int vis[101][101] = { 0 };queue<pair<int, int>> q;int m, n;int ret = 0;
public:int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {m = maze.size(), n = maze[0].size();int a1 = entrance[0], a2 = entrance[1];q.push({a1, a2});vis[a1][a2] = true;while(q.size()){ret++;int sz = q.size();//这里for里面不能直接用i < q.size(),因为这个循环的原理是没一次循环都会计算一次q.size(),而后面我们也在一直pop和push,所以q的大小是变化的for(int i = 0; i < sz; i++) {auto [a, b] = q.front();q.pop();for(int k = 0; k < 4; k++){int x = a + dx[k], y = b + dy[k];if((x >= 0 && y >= 0) && (x < m && y < n) && (!vis[x][y] && maze[x][y] == '.')){if(x == 0 || x == m - 1 || y == 0 || y == n - 1) return ret; //判断是否走到边界空格,也就是走到了出口q.push({x, y});vis[x][y] = true;}}}}return -1;}
};

 433. 最小基因变化

433. 最小基因变化 - 力扣(LeetCode)

题目有点长,我们来分段看一下:

  • 给我们几个长度为8的字符串,由‘ A ’,‘ C ’,‘ G ’,‘ T ’ 四个字母组成
  • 一次“基因变化”代表字符串中一个字母发生了变化,比如“AACCGGTT”发生一次基因变化后就是“AACCGGTA”
  • 而当一个基因发生变化后,变化后的字符串必须和bank中的其中一个字符串相同才能算是一次有效变化,否则无效
  • 题目给我们三个字符串start,end和bank,要我们找出使start变成end的最小有效变化次数,如果不能完成变化返回-1
  • start默认有效,但是不一定存在于bank中,下面来分析下这道题
  • 我们先来想办法把这道题转化为“边权为1的最短路问题”,如下图:

下面就是写代码中需要注意的地方:

  • 用bfs来解决,首先得需要一个队列queue,里面存的是各种字符串;还需要一个容器来标记当前的字符是否已经被我们搜索过,比如“AAAA” 扩展成 “CAAA” 后,可能会再次扩展成 “AAAA”,所以这里需要搞一个哈希表,当我们搜索过AAAA后,把A加入到哈希表中,下一次再次搜索到AAAA时,不再添加到队列里
  • 如何枚举所有的变化情况呢?一个循环即可,对原字符串一位一位遍历,然后对每一个位置的字符都做四次变化,按顺序依次修改成“A,C,G,T”的一个,修改前判断下哈希表即可
  • 当我们枚举出来一种情况后,也不是直接无脑地加入到队列里,先判断一下这种情况是否在bank里存在,如果bank里有的话再加入到队列里,没有的话直接舍弃这种情况;那么如何快速判断我们枚举的情况再bank里存在呢?如果每枚举出一种情况后直接遍历一次bank的话,那就太慢了,所以我们可以在一开始就把bank里的字符全扔一个哈希表里去,然后枚举的结果直接在哈希表里面查一下即可
class Solution 
{unordered_set<string> vis; //标记已经搜索过的状态unordered_set<string> hash; //存储基因库里的字符串string ch = "ACGT";queue<string> q;int ret = 0;
public:int minMutation(string startGene, string endGene, vector<string>& bank) {if(startGene == endGene) return 0; //初始和结束相同,不需要变化for(auto e : bank) hash.insert(e);if(!hash.count(endGene)) return -1; //终止字符不存在与bank中,直接不合法q.push(startGene); //先把起始字符放进队列里vis.insert(startGene); //标记一下该位置已经出现过了while(q.size()){ret++;int sz = q.size();for(int i = 0; i < sz; i++){string s = q.front(); //取队头元素q.pop();for(int j = 0; j < 8; j++) //遍历字符串每一个位置,把每一个位置的字符都改一次ACGT{string tmp = s;//每次只修改一个位置,所以下面不能直接s[j] = ch[k]//因为修改第一个位置之后,i++,此时是在修改了第一个位置的基础上再去修改第二个位置的,这就是修改了两次了for(int k = 0; k < 4; k++) {tmp[j] = ch[k];if(hash.count(tmp) && !vis.count(tmp)) //当这种结果在bank里存在,并且这种情况是第一次都搜索到时,添加到队列里,vis也添加一下{if(tmp == endGene) return ret; //如果已经是最终结果,直接返回retq.push(tmp);vis.insert(tmp);}}}}}return -1;}
};

127. 单词接龙

127. 单词接龙 - 力扣(LeetCode)

这道题的题意和上一题很相似,就是给我们两个单词begin和end,要我们把begin转化成end,返回最小转化次数,然后转化规则就是:

  • 每次改变时只能改变一个字符,并且只能转化成字符‘ a ’到字符‘ z ’ 中的一个
  • 改变的结果必须要worldList存在才能算数一次有效改变

下面来分析下这道题:

  • 这道题和上一题几乎是一模一样的,只是有几点不一样
  • 上一道题只要转化为四个字母,这道题要转化为26个
  • 上一题是返回转化次数,这道题是要返回转化的单词个数,包括开头和结尾,起始也就是转化次数 + 1
  • 其余的就不赘述了,直接上代码:
class Solution 
{unordered_set<string> vis, hash;queue<string> q;int ret = 0;
public:int ladderLength(string beginWord, string endWord, vector<string>& wordList) {if(beginWord == endWord) return 0;for(auto e : wordList) hash.insert(e);if(!hash.count(endWord)) return 0;q.push(beginWord);vis.insert(beginWord);while(q.size()){ret++;int sz = q.size();while(sz--){string s = q.front();q.pop();for(int i = 0; i < s.size(); i++){string tmp = s;char c = 'a';for(int j = 0; j < 26; j++){tmp[i] = c + j;if(hash.count(tmp) && !vis.count(tmp)){if(tmp == endWord) return ret + 1;q.push(tmp);vis.insert(tmp);}}}}}return 0;}
};

675. 为高尔夫比赛砍树

675. 为高尔夫比赛砍树 - 力扣(LeetCode)

题目描述还是很抽象,我们仍然分步来看下:

  • 给我们一个二维矩阵,矩阵由三种值构成:①0表示障碍,无法通过  ②1表示地面,可以行走  ③比1大的数表示数的高度,也可以行走,没有高度相同的树
  • 规定从左上角开始行动,可以往上下左右四个方向移动或砍树,砍完树后该单元格数字变成1
  • 我们需要按照树的高度从低到高的顺序砍,最后需要砍完所有的树,并返回砍完所有的树所需的最小步数;如果无法砍完所有的树,返回-1

下面来分析下这道题:

  • 我们先想办法把题目转化成“最短路问题”,如下图:
  • 那么我们如何知道砍树顺序呢?我们搞一个二维数组int[ ][ ],然后把每个下标存进去之后按照下标顺序由小到大排序即可,那么这个二维数组里面存的就是我们砍树的顺序
  • 如果发现一个下标无法走到下一个下标,直接返回-1即可
class Solution 
{vector<pair<int, int>> trees;queue<pair<int, int>> q;bool vis[51][51] = { 0 };int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int m, n;int ret = 0;
public:int cutOffTree(vector<vector<int>>& forest) {m = forest.size(), n = forest[0].size();//1,先找出砍树的顺序for(int i = 0; i < m; i++)for(int j = 0; j < n; j++) if(forest[i][j] > 1) trees.push_back({i, j}); //把要砍的树的下标放进去//利用lambda表达式配合sort排序sort(trees.begin(), trees.end(), [&](const pair<int, int>& p1, const pair<int, int>& p2) //捕捉forest{return forest[p1.first][p1.second] < forest[p2.first][p2.second];});//2,按照顺序砍树int bx = 0, by = 0;for(auto& [a, b] : trees){int step = bfs(forest, bx, by, a, b); //bfs作用是返回从起始坐标到终点坐标的最短距离if(step == -1) return -1;else ret += step;bx = a;by = b;}return ret;}int bfs(vector<vector<int>>& f, int bx, int by, int ex, int ey){if(bx == ex && by == ey) return 0;memset(vis, 0, sizeof(vis)); //每次都要重新初始化一下vis,因为上面主函数会多次调用bfs,所以每次到这里时vis可能是已经变化过的q = queue<pair<int, int>>();//这里同理,这个queue也不能搞成全局,如果要搞成全局,每次开始也要初始化一下q.push({bx, by});vis[bx][by] = true;int step = 0; //记录步数while(q.size()){step++;int sz = q.size();while(sz--){auto [a, b] = q.front();q.pop();for(int k = 0; k < 4; k++){int x = a + dx[k], y = b + dy[k];if((x >= 0 && y >= 0) && (x < m && y < n) && (f[x][y] && !vis[x][y])){if(x == ex && y == ey) return step;else q.push({x, y});vis[x][y] = true;}}}}return -1;}
};

相关文章:

算法学习(22)—— BFS解决最短路问题

关于最短路问题 最短路问题是“图论”里非常重要的一类问题&#xff0c;涉及的内容非常多&#xff0c;在这个专题里&#xff0c;我们主要讲“边权为1的最短路问题”&#xff0c;因为这个比较基础比较简单而关于啥是“边权为1的最短路问题”&#xff0c;我们通过下面的例子来讲…...

【双层模型】考虑供需双侧的综合能源双层优化模型

目录 主要内容 内容研究 1.模型简介 2 程序释义 部分代码 运行结果 下载链接 主要内容 该程序实现一个综合能源系统的优化调度双层模型&#xff0c;上下层分别采用差分进化算法和规划算法进行求解。模型考虑了多种能源设备&#xff0c;包括燃气轮机、燃气锅炉、风电…...

【读书笔记/源码】How Tomcat Works 笔记- c11~c13

chapter11: standardwrapperchapter12: 无程序 第十章 安全性 servlet容器是通过一个名为验证器的阀来支持安全限制的。当servlet容器启动时&#xff0c;验证器阀会被添加到Context容器的管道中。 验证器阀会调用Context容器的领域对象的authenticate()方法&#xff0c;传入…...

Electron快速入门——跨平台桌面端应用开发框架

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...

Vision Transformer模型详解(附pytorch实现)

写在前面 最近&#xff0c;我在学习Transformer模型在图像领域的应用。图像处理任务一直以来都是深度学习领域的重要研究方向&#xff0c;而传统的卷积神经网络已在许多任务中取得了显著的成绩。然而&#xff0c;近年来&#xff0c;Transformer模型由于其在自然语言处理中的成…...

中国区域创新创业指数IRIEC数据(省级、地市级)1990-2020年-社科数据

中国区域创新创业指数IRIEC数据&#xff08;省级、地市级&#xff09;1990-2020年-社科数据https://download.csdn.net/download/paofuluolijiang/90028728 https://download.csdn.net/download/paofuluolijiang/90028728 中国区域创新创业指数&#xff08;IRIEC&#xff09;…...

Elasticsearch:减少 Elastic 容器镜像中的 CVE(常见的漏洞和暴露)

作者&#xff1a;来自 Elastic Maxime Greau 在这篇博文中&#xff0c;我们将讨论如何通过在 Elastic 产品中切换到最小基础镜像并优化可扩展漏洞管理程序的工作流程来显著减少 Elastic 容器镜像中的常见漏洞和暴露 (Common Vulnerabilities and Exposures - CVEs)。 基于 Chai…...

webpack02

webpack中常用loader postcss-loader 在css-loader之前&#xff0c;对css进行一些操作&#xff0c;&#xff0c;&#xff0c;比如统一加前缀&#xff0c;&#xff0c;或者是重置样式&#xff0c;&#xff0c;&#xff0c; 这个postcss-loader会自己去找 postcss工具&#xff0…...

腾讯云更改用户为root

最近买了台99元一年的2核的云服务器&#xff0c;方便学习一些java开发中间件&#xff0c;以及部署一些项目。 1.设置root用户密码 sudo passwd root 2.修改配置文件 ll /etc | grep ssh cd /etc/ssh/ ls vim sshd_config 输入/PasswordAuthentication 寻找 输入:set nu 再按下…...

Excel导入导出-若依版本

最终效果 1、导出 1、在实体类上加注解 Excel(name “客户类型名称”) ToString AllArgsConstructor NoArgsConstructor public class UserType extends BaseEntity2 implements Serializable {Excel(name "客户类型ID", cellType Excel.ColumnType.NUMERIC…...

【Qt】快速添加对应类所需的头文件包含

快速添加对应类所需的头文件包含 一&#xff0c;简介二&#xff0c;操作步骤 一&#xff0c;简介 本文介绍一下&#xff0c;如何快速添加对应类所需要包含的头文件&#xff0c;可以提高开发效率&#xff0c;供参考。 二&#xff0c;操作步骤 以QTime类为例&#xff1a; 选中…...

基于服务器部署的综合视频安防系统的智慧快消开源了。

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。国产化人工智能“…...

浅谈棋牌游戏开发流程七:反外挂与安全体系——守护游戏公平与玩家体验

一、前言&#xff1a;为什么反外挂与安全这么重要&#xff1f; 对于任何一款线上棋牌游戏而言&#xff0c;公平性和玩家安全都是最重要的核心要素之一。如果游戏环境充斥着各式各样的外挂、作弊方式&#xff0c;不仅会毁坏玩家体验&#xff0c;更会导致游戏生态崩塌、口碑下滑…...

Laravel操作ElasticSearch

在Laravel项目中操作ElasticSearch可以通过以下步骤来实现&#xff0c;通常会借助相应的ElasticSearch客户端扩展包。 ### 安装ElasticSearch客户端包 在Laravel项目中&#xff0c;常用的是 elasticsearch/elasticsearch 这个PHP客户端库来与ElasticSearch进行交互&#xff0c…...

缓存-文章目录

关于缓存系列文章&#xff1a; 缓存学习总结1&#xff08;缓存分类&#xff09; 缓存学习总结2&#xff08;服务器本地缓存&#xff09; 缓存学习总结3&#xff08;服务器内存缓存&#xff09;推荐使用 缓存学习总结4&#xff08;分布式缓存&#xff09; 关于redis系列文章…...

安装教程:慧集通集成平台(DataLinkX)智能体客户端安装操作(Linux/windows/mac)

1.下载客户端 使用提供的账号登录集成平台后台(https://www.datalinkx.cn/),点击左侧菜单栏【智能体】→【智能体】进入到智能体列表界面&#xff0c;在该界面我们找到功能栏中的下载按钮点击则会弹出下载界面&#xff0c;在该界面我们可以选择不同的系统操作系统来下载对应版…...

解决vmware虚拟机和宿主机之间不能复制粘贴

在虚拟机内执行一下命令 /usr/bin/vmware-user 更多解决方案 https://www.cnblogs.com/wutou/p/17629408.html...

由源程序到运行

由源程序到运行 第一步&#xff1a;编写源程序 assume cs:codesg codesg segmentmov ax,0123Hmov bx,0456Hadd ax,bxadd ax,axmov ax,4c00hint 21h codesg ends end第二步&#xff1a;进行编译 进入到编译目录 编译 .asm文件生成目标文件&#xff08;.obj&#xff09; m…...

Java-JDBC的使用

目录 一、JDBC(java数据库连接)&#xff1a;java database connector 二、使用JDBC的步骤 三、加条件查询 四、预处理&#xff08;防止SQL注入&#xff09; 五、Statement和PreparedStatement的优略 六、将数据中的数据查询出来后需要保存在一个集合中&#xff0c;方便前端…...

如何优化亚马逊广告以提高ROI?

在竞争激烈的亚马逊市场中&#xff0c;优化广告以提高投资回报率&#xff08;ROI&#xff09;是卖家的关键任务。以下是一些实用的策略&#xff1a; 一、精准的关键词研究与选择 深入了解产品特性和目标受众 详细分析产品的功能、用途、优势和适用人群。例如&#xff0c;如果你…...

身是菩提树,心如明镜台;时时勤拂拭,莫使惹尘埃。

神秀: 身是菩提树&#xff0c;心如明镜台&#xff1b;时时勤拂拭&#xff0c;莫使惹尘埃。 第一个毛病1&#xff1a; 在神秀看来,修行就是要保持我们本来干净的心, 跟外部世界的灰尘之间的隔绝状态,始终保持这种隔绝, 尘世是什么&#xff1f; 尘就是烦恼,人世间无处不是烦恼&a…...

如何修复富士相机卡错误并恢复卡数据

富士相机以其卓越的图像质量而闻名&#xff0c;但不幸的是&#xff0c;其 SD 卡错误可能会意外发生&#xff0c;导致数据丢失和摄影会话中断。 在本指南中&#xff0c;我们将引导您了解常见的富士相机 SD 卡错误、如何修复这些错误&#xff0c;以及如何有效地从损坏的卡中恢复…...

呼叫中心中间件实现IVR进入排队,判断排队超时播放提示音

文章目录 [TOC](文章目录) 前言需求排队结束原因 联系我们实现步骤1. 调用http接口返回动作2. 启用拨号方案 前言 需求 呼叫中心需要实现调用IVR接口进入排队&#xff0c;如果是因为等待超时导致退出排队的&#xff0c;那就播放一段提示音再挂断通话&#xff1b;其他的情况就…...

数据分析思维(八):分析方法——RFM分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python&#xff0c;更重要的是数据分析思维。没有数据分析思维和业务知识&#xff0c;就算拿到一堆数据&#xff0c;也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》&#xff0c;本文内容就是提取…...

SpringBoot3动态切换数据源

背景 随着公司业务战略的发展&#xff0c;相关的软件服务也逐步的向多元化转变&#xff0c;之前是单纯的拿项目&#xff0c;赚人工钱&#xff0c;现在开始向产品化\服务化转变。最近雷袭又接到一项新的挑战&#xff1a;了解SAAS模型&#xff0c;考虑怎么将公司的产品转换成多租…...

Java虚拟机面试题:内存管理(上)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

WPF通过反射机制动态加载控件

Activator.CreateInstance 是 .NET 提供的一个静态方法&#xff0c;它属于 System 命名空间。此方法通过反射机制根据提供的类型信息。 写一个小demo演示一下 要求&#xff1a;在用户反馈界面点击建议或者评分按钮 弹出相应界面 编写MainWindow.xmal 主窗体 <Window x:C…...

前端学习-操作元素属性(二十三)

前言 假期快乐&#xff0c;大家加油 操作元素属性 操作元素常用属性 还可以通过 JS 设置/修改标签元素属性&#xff0c;比如通过 src更换 图片最常见的属性 比如:href、title、src等语法:对象.属性 值 const pic document.querySelector(img);pic.src ./images/b0.jpgp…...

Javascript 编写的一个红、黄、绿灯交替变亮

为了创建一个简单但功能完整的交通灯程序&#xff0c;我们将使用 HTML、CSS 和 JavaScript 来实现红、黄、绿三种颜色按照规定的顺序循环显示。这个例子将确保灯光按照红 -> 绿 -> 黄的顺序循环&#xff0c;并且可以调整每个灯光的持续时间以模拟真实的交通灯行为。 效果…...

基于64QAM的载波同步和定时同步性能仿真,包括Costas环和gardner环

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 载波同步是…...

小于n的最大数 - 贪心算法 - C++

字节经典面试题 给定一个整数n&#xff0c;并从1~9中给定若干个可以使用的数字&#xff0c;根据上述两个条件&#xff0c;得到每一位都为给定可使用数字的、最大的小于整数n的数&#xff0c;例如&#xff0c;给定可以使用的数字为 {2,3,8} 三个数&#xff1a;给定 n3589&#x…...

leetcode(hot100)4

解题思路&#xff1a;双指针思想 利用两个for循环&#xff0c;第一个for循环把所有非0的全部移到前面&#xff0c;第二个for循环将指针放在非0的末尾全部加上0。 还有一种解法就是利用while循环双指针条件&#xff0c;当不为0就两个指针一起移动 &#xff0c;为0就只移动右指针…...

【Pandas】pandas Series xs

Pandas2.2 Series Indexing, iteration 方法描述Series.get()用于根据键&#xff08;索引标签&#xff09;从 Series 中获取值Series.at用于快速访问标量值&#xff08;单个元素&#xff09;的访问器Series.iat用于快速访问标量值&#xff08;单个元素&#xff09;的访问器Se…...

【linux内核分析-存储】EXT4源码分析之“文件删除”原理【七万字超长合并版】(源码+关键细节分析)

EXT4源码分析之“文件删除”原理【七万字超长合并版】&#xff08;源码关键细节分析&#xff09;&#xff0c;详细的跟踪了ext4文件删除的核心调用链&#xff0c;分析关键函数的细节&#xff0c;解答了开篇中提出的三个核心疑问。 文章目录 提示前言全文重点索引1.源码解析1.1 …...

一个在ios当中采用ObjectC和opencv来显示图片的实例

前言 在ios中采用ObjectC编程利用opencv来显示一张图片&#xff0c;并简单绘图。听上去似乎不难&#xff0c;但是实际操作下来&#xff0c;却不是非常的容易的。本文较为详细的描述了这个过程&#xff0c;供后续参考。 一、创建ios工程 1.1、选择ios工程类型 1.2、选择接口模…...

使用Python实现基于强化学习的游戏AI:打造智能化游戏体验

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…...

STM32G0B1 can Error_Handler 解决方法

问题现象 MCU上电&#xff0c;发送0x13帧数据固定进入 Error_Handler 硬件介绍 MCU :STM32G0B1 can:NSI1042 tx 接TX RX 接RX 折腾了一下午&#xff0c;无解&#xff0c;问题依旧&#xff1b; 对比测试 STM32G431 手头有块G431 官方评估版CAN 模块&#xff1b; 同样的…...

洛谷 P2511 [HAOI2008] 木棍分割

第一问很简单&#xff0c;第二问 d p dp dp。 &#xff08;真是哪都能混个 d p dp dp&#xff09; 参考题解 #include <bits/stdc.h>using namespace std;int read() {int x 0, f 1; char c getchar();while (c < 0 || c > 9) {if (c -) f -1; c getcha…...

二极管钳位电路分享

二极管钳位&#xff08;I/O的过压/浪涌保护等&#xff09; 如果我们的电路环境接收外部输入信号容易受到噪声影响&#xff0c;那我们必须采取过压和浪涌保护措施&#xff0c;其中一个方式就是二极管钳位保护。 像上图&#xff0c;从INPUT输入的电压被钳位在-Vf与VCCVf之间&…...

guestfish/libguestfs镜像管理工具简介

文章目录 简介guestfishlibguestfs项目 例子原理代码libguestfs架构参考 简介 guestfish Guestfish 是libguestfs项目中的一个工具软件&#xff0c;提供修改虚机镜像内部配置的功能。它不需要把虚机镜像挂接到本地&#xff0c;而是为你提供一个shell接口&#xff0c;你可以查…...

AutoSar架构学习笔记

1.AUTOSAR&#xff08;Automotive Open System Architecture&#xff0c;汽车开放系统架构&#xff09;是一个针对汽车行业的软件架构标准&#xff0c;旨在提升汽车电子系统的模块化、可扩展性、可重用性和互操作性。AUTOSAR的目标是为汽车电子控制单元&#xff08;ECU&#xf…...

Scade pragma: separate_io

概述 在 Scade 语言中&#xff0c;支持对用户自定义算子使用 separate_io pragma 进行修饰。其形式如&#xff1a; function #pragma kcg separate_io #end N(x: int8) returns (y,z: int8) let y x;z x; tel在上例中&#xff0c;算子N 就被 pragma #pragma kcg separate_i…...

三天速成微服务

微服务技术栈 总结 微服务技术对比 技术栈 SpringCloud SpringCloud是目前国内使用最广泛的微服务框架。官网地址:https://spring.io/projects/spring-cloud Springboot和SpringCould兼容性 代码目录结构如下 用于远程调用Bean 代码 package cn.itcast.order.config;//import …...

【MySQL】九、表的内外连接

文章目录 前言Ⅰ. 内连接案例&#xff1a;显示SMITH的名字和部门名称 Ⅱ. 外连接1、左外连接案例&#xff1a;查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 2、右外连接案例&#xff1a;对stu表和exam表联合查询&#xff0c;把…...

GitLab 创建项目、删除项目

1、创建项目 点击左上角图标&#xff0c;回到首页 点击 Create a project 点击 Create blank project 输入项目名称&#xff0c;点击Create Project 创建成功 2、删除项目 进入项目列表 点击对应项目&#xff0c;进入项目 进入Settings页面 拖到页面底部&#xff0c;展开Adva…...

python学opencv|读取图像(二十六)使用cv2.putText()绘制文字进阶-在图像上写文字

【1】引言 前序已经学会了在画布上绘制文字的大部分技巧&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;二十三&#xff09;使用cv2.putText()绘制文字-CSDN博客 python学opencv|读取图像&#xff08;二十四&#xff09;使用cv2.putText()绘制…...

Apache HTTPD 多后缀解析漏洞

目录 漏洞简介 漏洞环境 漏洞复现 漏洞防御 漏洞简介 Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执行不同的指令。比如&#xff0c;如下配置文件&#xff1a; AddType text/html .html AddLanguage zh-CN .cn 以上就是Apache多后缀的特性。如果运维…...

(二)当人工智能是一个函数,函数形式怎么选择?ChatGPT的函数又是什么?

在上一篇文章中&#xff0c;我们通过二次函数的例子&#xff0c;讲解了如何训练人工智能。今天&#xff0c;让我们进一步探讨&#xff1a;面对不同的实际问题&#xff0c;应该如何选择合适的函数形式&#xff1f; 一、广告推荐系统中的函数选择 1. 业务目标 想象一下&#x…...

JavaScript学习-入门篇

​ JavaScript的运行环境 开发环境就是开发JavaScript代码所需的环境&#xff0c;一般建议新手刚刚开始使用一些记事本工具&#xff08;如sublime、editPlus、VScode&#xff09;&#xff0c;锻炼代码的手感。等学习到一定阶段&#xff0c;就可以使用集成开发工具IDE&#xff0…...

今日头条ip属地根据什么显示?不准确怎么办

在今日头条这样的社交媒体平台上&#xff0c;用户的IP属地信息对于维护网络环境的健康与秩序至关重要。然而&#xff0c;不少用户发现自己的IP属地显示与实际位置不符&#xff0c;这引发了广泛的关注和讨论。本文将深入探讨今日头条IP属地的显示依据&#xff0c;并提供解决IP属…...