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

广度优先搜索算法 - 迷宫找路

广度优先搜索算法

  • 1 思考问题
    • 1.1 这个迷宫需不需要指定入口和出口?
  • 2 先粗略实现
    • 2.1 源码
    • 2.2 源码解释
  • 3 优化代码
    • 3.1 优化读取文件部分
    • 3.2 增加错误处理
  • 4 再优化-让程序变得更加灵活
    • 4.1 用户外部可以循环输入入口和出口
  • 5 完整代码

这是一个提问者的提出的问题: 连接

数据结构算法,用C语言完成,
迷宫寻路:以一个的长方阵表示迷宫,用0和1分别表示迷宫中的通路和障碍,将迷宫的长方阵存储在相关数据文件中,迷宫数据从该文件中读取。找到一条从入口到出口的通路,或得到没有通路的结论。将找到的通路以三元组的形式输出,表示经过节点的坐标,表示从入口出发达到该节点的距离,每走一步距离加1。最终输出全部通路,并统计路径距离。

经过我们的讨论,我决定重新实现我之前的算法!以下是完整内容

1 思考问题

1.1 这个迷宫需不需要指定入口和出口?

我之前提供的算法是默认起点为左上角,终点为右下角。如果你的迷宫入口或者出口为“1”,这将导致无法找到路径;这也就解释了,为什么你的迷宫会出现这样的结果!

根据的你的提供迷宫,我猜测,你的想法可能是:这个迷宫不需要指定出口和入口,而是让程序自己找。
这样的情况算法实现起来会更复杂,更困难,需要加很多个约束条(比如,入口不能是出口等)!
根据之前的沟通,我感觉您像是初学者(如果我猜错了,冒犯到您,向您道歉),应该不会一上来就挑战那么难的算法!所以这个算法应该是指定入口和出口的,这样就会让程序变得简单很多!

2 先粗略实现

2.1 源码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>#define MAX_SIZE 100typedef struct {int x;int y;int distance;
} Node;void BFS(int maze[][MAX_SIZE], int n, int m, int startX, int startY, int endX, int endY) {// 定义方向数组,表示上下左右四个方向int dx[4] = { -1, 1, 0, 0 };int dy[4] = { 0, 0, -1, 1 };// 定义队列和标记数组Node queue[MAX_SIZE * MAX_SIZE];int front = 0, rear = 0;bool visited[MAX_SIZE][MAX_SIZE] = { false };Node parentMap[MAX_SIZE][MAX_SIZE];// 将起点加入队列中Node start = { startX, startY, 0 };queue[rear++] = start;visited[startX][startY] = true;// 开始广度优先搜索while (front < rear) {// 取出队列中的节点Node curr = queue[front++];// 检查是否到达终点if (curr.x == endX && curr.y == endY) {printf("Find a path: ");printf("(%d,%d,%d)", curr.x, curr.y, curr.distance);Node parent = parentMap[curr.x][curr.y];while (parent.x != startX || parent.y != startY) {printf(" <- ");printf("(%d,%d,%d)", parent.x, parent.y, parent.distance);parent = parentMap[parent.x][parent.y];}printf(" <- ");printf("(%d,%d,0)\n", startX, startY);continue;}// 访问相邻节点for (int i = 0; i < 4; i++) {int nx = curr.x + dx[i];int ny = curr.y + dy[i];if (nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] == 0 && !visited[nx][ny]) {Node next = { nx, ny, curr.distance + 1 };queue[rear++] = next;visited[nx][ny] = true;parentMap[nx][ny] = curr;}}}
}int main() {// 从文件中读取迷宫数据int maze[MAX_SIZE][MAX_SIZE];int n, m;FILE *fp = fopen("maze.txt", "r");fscanf(fp, "%d%d", &n, &m);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {fscanf(fp, "%d", &maze[i][j]);}}fclose(fp);// 确定起点和终点int startX = 0,startY = 0, endX = n - 1, endY = m - 1;// 使用广度优先搜索算法搜索最短路径BFS(maze, n, m, startX, startY, endX, endY);return 0;
}

2.2 源码解释

#define _CRT_SECURE_NO_WARNINGS

我的编译器使用的是vs2017,而我在代码中使用了fopen等函数,编译器认为:使用的是不安全的C标准库函数fopen(),建议使用更安全的fopen_s()函数来代替。但是没有必要,所以我加上了这行代码,让编译器忽略这个警告。如果你的编译器运行我之前的代码,编译没有报错,你也可以将这一行去掉。

	int startX = 0,startY = 0, endX = n - 1, endY = m - 1;

这一行是在main函数中的,他的目的就是确定迷宫的入口和出口,默认是左上到右下,你可以通过更改数值实现,自定义入口和出口。
例如:起点(0,1);终点(6,8)

int startX = 0,startY = 1, endX = 6, endY = 7;

这里我提供一个7X9迷宫:

7 9
1 0 0 0 1 0 1 1 0
0 1 0 1 1 0 0 0 0
0 0 0 0 0 0 1 1 1
1 1 0 1 0 1 0 0 0
0 0 0 1 0 0 0 1 1
1 1 0 0 0 1 0 0 0
0 0 0 1 0 1 0 0 0

你可能注意到了,我的迷宫结构和之前提供给你的迷宫结构发生了变化,在开始处,增加了迷宫的大小“7 9”,这是告诉程序我迷宫的大小,也就是说,现在的迷宫大小我们也可以是自定义的了
运行结果:

在这里插入图片描述

代码已经可以实现了!

3 优化代码

3.1 优化读取文件部分

以下是将读取迷宫数据部分的代码封装成一个函数 readMaze,并添加了判断文件是否成功打开的代码:

bool readMaze(const char *filename, int maze[][MAX_SIZE], int *n, int *m) {FILE *fp = fopen(filename, "r");if (!fp) {printf("Error: Failed to open file %s.\n", filename);return false;}fscanf(fp, "%d%d", n, m);for (int i = 0; i < *n; i++) {for (int j = 0; j < *m; j++) {fscanf(fp, "%d", &maze[i][j]);}}fclose(fp);return true;
}

然后,在 main 函数中调用该函数读取迷宫数据

int main() {int maze[MAX_SIZE][MAX_SIZE];int n, m;if (!readMaze("maze.txt", maze, &n, &m)) {return 1;}// 确定起点和终点int startX = 0, startY = 0, endX = n-1, endY = m-1;//注意:可以自定义// 使用广度优先搜索算法搜索最短路径BFS(maze, n, m, startX, startY, endX, endY);return 0;
}

这样做的好处是,将读取迷宫数据的代码封装成一个函数,可以使 main 函数更加清晰简洁,也方便在其他函数中重复使用该代码。另外,添加判断文件是否成功打开的代码,可以在打开文件失败时及时提示用户,并退出程序。

3.2 增加错误处理

  1. 判断自定义的迷宫入口和出口是否合法,比如说,刚才迷宫大小为7*9,你却定义一个出口为(10,11),那么这个出口肯定是越界了
  2. 以及判断你自定义迷宫入口和出口是否合法,也就是说,如果你设计迷宫入口或者出口为“1”,也是不合理的。
    一个函数实现这两个功能
bool isValidPoint(int maze[][MAX_SIZE], int n, int m, int x, int y) {if (x < 0 || x >= n || y < 0 || y >= m) {return false;}if (maze[x][y] != 0) {return false;}return true;
}

然后,我们可以在 BFS 函数和 main 函数中使用该函数来检查起点和终点的合法性。例如,在 BFS 函数中,可以将下面这行代码:

if (nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] == 0 && !visited[nx][ny]) {

修改为:

if (isValidPoint(maze, n, m, nx, ny) && !visited[nx][ny]) {

在 main 函数中,可以添加以下代码来检查起点和终点的合法性:

if (!isValidPoint(maze, n, m, startX, startY)) {printf("Error: Invalid start point (%d,%d).\n", startX, startY);return 1;
}
if (!isValidPoint(maze, n, m, endX, endY)) {printf("Error: Invalid end point (%d,%d).\n", endX, endY);return 1;
}

这样,当输入的起点或终点不合法时,程序会输出错误信息并退出。
我们使用刚才的迷宫进行测试,起点设置为(0,0)
运行如下:
在这里插入图片描述
因为刚才的迷宫入口为1,所以给出了(0,0)位置无效的提示,其他的可以自行测试!

4 再优化-让程序变得更加灵活

4.1 用户外部可以循环输入入口和出口

输入格式为0,1英文逗号隔开

int main() {int maze[MAX_SIZE][MAX_SIZE];int n, m;if (!readMaze("maze.txt", maze, &n, &m)) {return 1;}// 从键盘输入起点和终点的坐标int startX, startY, endX, endY;while (1) {printf("Please enter the start point (x,y), or enter -1 to quit: ");int len = scanf("%d,%d", &startX, &startY);if (len == 1 && startX == -1)break;if ( len != 2) {printf("Error: Invalid input for start point.\n");continue;}if (!isValidPoint(maze, n, m, startX, startY)) {printf("Error: Invalid start point (%d,%d).\n", startX, startY);continue;}printf("Please enter the end point (x,y): ");if (scanf("%d,%d", &endX, &endY) != 2) {printf("Error: Invalid input for end point.\n");continue;}if (!isValidPoint(maze, n, m, endX, endY)) {printf("Error: Invalid end point (%d,%d).\n", endX, endY);continue;}// 使用广度优先搜索算法搜索最短路径BFS(maze, n, m, startX, startY, endX, endY);}return 0;
}

运行结果:
在这里插入图片描述

5 完整代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>#define MAX_SIZE 100typedef struct {int x;int y;int distance;
} Node;bool isValidPoint(int maze[][MAX_SIZE], int n, int m, int x, int y) {if (x < 0 || x >= n || y < 0 || y >= m) {return false;}if (maze[x][y] != 0) {return false;}return true;
}bool readMaze(const char *filename, int maze[][MAX_SIZE], int *n, int *m) {FILE *fp = fopen(filename, "r");if (!fp) {printf("Error: Failed to open file %s.\n", filename);return false;}fscanf(fp, "%d%d", n, m);for (int i = 0; i < *n; i++) {for (int j = 0; j < *m; j++) {fscanf(fp, "%d", &maze[i][j]);}}fclose(fp);return true;
}void BFS(int maze[][MAX_SIZE], int n, int m, int startX, int startY, int endX, int endY) {// 定义方向数组,表示上下左右四个方向int dx[4] = { -1, 1, 0, 0 };int dy[4] = { 0, 0, -1, 1 };// 定义队列和标记数组Node queue[MAX_SIZE * MAX_SIZE];int front = 0, rear = 0;bool visited[MAX_SIZE][MAX_SIZE] = { false };Node parentMap[MAX_SIZE][MAX_SIZE];// 将起点加入队列中Node start = { startX, startY, 0 };queue[rear++] = start;visited[startX][startY] = true;// 开始广度优先搜索while (front < rear) {// 取出队列中的节点Node curr = queue[front++];// 检查是否到达终点if (curr.x == endX && curr.y == endY) {printf("Find a path: ");printf("(%d,%d,%d)", curr.x, curr.y, curr.distance);Node parent = parentMap[curr.x][curr.y];while (parent.x != startX || parent.y != startY) {printf(" <- ");printf("(%d,%d,%d)", parent.x, parent.y, parent.distance);parent = parentMap[parent.x][parent.y];}printf(" <- ");printf("(%d,%d,0)\n", startX, startY);continue;}// 访问相邻节点for (int i = 0; i < 4; i++) {int nx = curr.x + dx[i];int ny = curr.y + dy[i];if (isValidPoint(maze, n, m, nx, ny) && !visited[nx][ny]) {Node next = { nx, ny, curr.distance + 1 };queue[rear++] = next;visited[nx][ny] = true;parentMap[nx][ny] = curr;}}}
}int main() {int maze[MAX_SIZE][MAX_SIZE];int n, m;if (!readMaze("maze.txt", maze, &n, &m)) {return 1;}// 从键盘输入起点和终点的坐标int startX, startY, endX, endY;while (1) {printf("Please enter the start point (x,y), or enter -1 to quit: ");int len = scanf("%d,%d", &startX, &startY);if (len == 1 && startX == -1)break;if ( len != 2) {printf("Error: Invalid input for start point.\n");continue;}if (!isValidPoint(maze, n, m, startX, startY)) {printf("Error: Invalid start point (%d,%d).\n", startX, startY);continue;}printf("Please enter the end point (x,y): ");if (scanf("%d,%d", &endX, &endY) != 2) {printf("Error: Invalid input for end point.\n");continue;}if (!isValidPoint(maze, n, m, endX, endY)) {printf("Error: Invalid end point (%d,%d).\n", endX, endY);continue;}// 使用广度优先搜索算法搜索最短路径BFS(maze, n, m, startX, startY, endX, endY);}return 0;
}

maze.txt内容

7 9
1 0 0 0 1 0 1 1 0
0 1 0 1 1 0 0 0 0
0 0 0 0 0 0 1 1 1
1 1 0 1 0 1 0 0 0
0 0 0 1 0 0 0 1 1
1 1 0 0 0 1 0 0 0
0 0 0 1 0 1 0 0 0

相关文章:

广度优先搜索算法 - 迷宫找路

广度优先搜索算法1 思考问题1.1 这个迷宫需不需要指定入口和出口&#xff1f;2 先粗略实现2.1 源码2.2 源码解释3 优化代码3.1 优化读取文件部分3.2 增加错误处理4 再优化-让程序变得更加灵活4.1 用户外部可以循环输入入口和出口5 完整代码这是一个提问者的提出的问题&#xff…...

泡脚材料简记

文章目录一般条件中药包&#xff08;药粉&#xff09;泡脚丸中药包&#xff08;药材&#xff09;艾叶生姜益母草藏红花食盐花椒白醋柠檬藿香泡脚私方紫苏叶、白术、白芍、黄芪、青皮、柴胡、夜交藤、丹参、当归&#xff0c;每种各10g艾叶、花椒、肉桂、桂枝、红花干姜30克、小茴…...

【计算机网络】因特网概述

文章目录因特网概述网络、互联网和因特网互联网历史与ISP标准化与RFC因特网的组成三种交换方式电路交换分组交换和报文交换三种交换方式的对比与总结计算机网络的定义和分类计算机网络的定义计算机网络的分类计算机网络的性能指标速率带宽吞吐量时延时延带宽积往返时间利用率丢…...

STC单片机 VS/HX1838红外接收和发送实验

STC单片机 VS/HX1838红外接收和发送实验 📌相关篇《STC单片机获取红外解码从串口输出》🔨所使用的红外接收头VS1838 📋VS1838引脚定义🌿5MM发射头,940nm红外发射二极管 红外遥控发射头。(外观看起来和普通的发光二极管没有什么差异,购买时需要注意确认)。 🔰采用的…...

前端开发常用案例(一)

前端开发常用案例1.实现三角形百度热榜样式分页效果小米商城自动轮播图效果二级下拉菜单效果时间轴效果展示音乐排行榜效果鼠标移入文字加载动画鼠标悬停缩放效果1.实现三角形 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8…...

Linux 日志查找常用命令

1.1 cat、zcat cat -n app.log | grep "error"&#xff1a;查询日志中含有某个关键字error的信息&#xff0c;显示行号。 cat -n app.log | grep "error" --color&#xff1a;查询日志中含有某个关键字error的信息&#xff0c;显示行号&#xff0c;带颜色…...

CleanMyMac4.12.5最新版安装下载教程

告别硬盘空间不足&#xff0c;让您的Mac极速如新CleanMyMac是一款强大的 Mac 清理、加速工具和健康卫士&#xff0c;让您的 Mac 加快启动速度。CleanMyMac是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻…...

RFID射频识别技术(四) RFID高频电路基础|课堂笔记|10月11日

2022年10月11日 week7 ​​​​​​​ 目录 ​​​​​​​ 第四讲: RFID高频电路基础 一、RLC(串联)电路的阻抗...

数据库系统是什么?它由哪几部分组成?

数据库系统&#xff08;Database System&#xff0c;DBS&#xff09;由硬件和软件共同构成。硬件主要用于存储数据库中的数据&#xff0c;包括计算机、存储设备等。软件部分主要包括数据库管理系统、支持数据库管理系统运行的操作系统&#xff0c;以及支持多种语言进行应用开发…...

华为OD机试题 - 任务混部(JavaScript)

最近更新的博客 2023新华为OD机试题 - 斗地主(JavaScript)2023新华为OD机试题 - 箱子之形摆放(JavaScript)2023新华为OD机试题 - 考古学家(JavaScript)2023新华为OD机试题 - 相同数字的积木游戏 1(JavaScript)2023新华为OD机试题 - 最多等和不相交连续子序列(JavaScri…...

键盘输入a,到屏幕显示,操作系统做了什么

首先&#xff0c;假定操作系统有中断系统。 等待的键盘写入的时候&#xff0c;txt进程被read函数阻塞。输入a之后&#xff0c;首先控制器&#xff0c;把扫描到的a放入到了控制器的寄存器中。触发硬中断通知cpu—> 中断IO控制方式&#xff0c;由硬件触发的。键盘读入中断cpu…...

Python机器学习入门笔记(2)—— 分类算法

目录 转换器&#xff08;transformer&#xff09;和估计器&#xff08;estimator&#xff09; K-近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;算法 模型选择与调优 交叉验证&#xff08;Cross-validation&#xff09; GridSearchCV API 朴素贝叶…...

Docker镜像发布到阿里云和私有库

目录 一、Docker镜像 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;Docker镜像加载原理 &#xff08;三&#xff09;镜像分层结构优势 &#xff08;四&#xff09;重点理解 &#xff08;五&#xff09;docker commit操作实例 &#xff08;六&#xff09;总…...

初识CSS,美化HTML

CSS称为&#xff1a;层叠样式表&#xff08;Cascading style sheets&#xff09;美化HTML即给页面种的HTML标签设置样式CSS语法规则css要写在head标签的里边&#xff0c;title标签的下面&#xff0c;用style标签框住<head> <title>...</title> <style>…...

华为OD机试 - 二维矩阵的最大值(Python)

题目二维矩阵的最大值 给定一个仅包含0和1的n*n二维矩阵 请计算二维矩阵的最大值 计算规则如下 每行元素按下标顺序组成一个二进制数(下标越大约排在低位), 二进制数的值就是该行的值,矩阵各行之和为矩阵的值允许通过向左或向右整体循环移动每个元素来改变元素在行中的位置 …...

华为OD机试 - 快递业务站(Python)

快递业务站 题目 快递业务范围有 N 个站点,A 站点与 B 站点可以中转快递,则认为 A-B 站可达, 如果 A-B 可达,B-C 可达,则 A-C 可达。 现在给 N 个站点编号 0、1、…n-1,用 s[i][j]表示 i-j 是否可达, s[i][j] = 1表示 i-j可达,s[i][j] = 0表示 i-j 不可达。 现用二维…...

百度沈抖:文心一言将通过百度智能云对外提供服务

2月17日&#xff0c;在2023 AI工业互联网高峰论坛上&#xff0c;百度智能云宣布“文心一言”将通过百度智能云对外提供服务&#xff0c;为产业带来AI普惠。 百度集团执行副总裁、百度智能云事业群总裁沈抖表示&#xff0c;“文心一言”是基于百度智能云技术打造出来的大模型&a…...

cmd 窗口、记事本打开后一片空白且几秒钟后闪退的问题解决方案汇总

前言 前段时间&#xff0c;电脑忽然出现了问题&#xff0c;首先是通过 微软应用商店 Microsoft Store 下载安装的 Snipaste 截图软件崩溃&#xff0c;不过将其卸载后&#xff0c;通过电脑管家下载后又可以正常使用了。 之后就是突然发现&#xff0c;记事本文本文档不能使用了…...

Linux 安装 SNMP服务

从安装盘IOS中导入安装SNMP. --挂载系统安装盘 [rootnb /]# mount -o loop -t iso9660 /software/radhat.iso /media mount: /dev/loop0 is write-protected, mounting read-only --导入安装包 [rootnb /]# rm -f /etc/yum.repos.d/*.repo [rootnbubackup /]# cat >/etc/yu…...

华为OD机试 - 滑动窗口最大和(Python)

滑动窗口最大和 有一个N个整数的数组,和一个长度为M的窗口。 窗口从数组内的第一个数开始滑动,直到窗口不能滑动为止。 每次滑动产生一个窗口,和窗口内所有数的和, 求窗口滑动产生的所有窗口和的最大值 输入 第一行输入一个正整数N,表示整数个数0 < N < 100000 …...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

深度解析:etcd 在 Milvus 向量数据库中的关键作用

目录 &#x1f680; 深度解析&#xff1a;etcd 在 Milvus 向量数据库中的关键作用 &#x1f4a1; 什么是 etcd&#xff1f; &#x1f9e0; Milvus 架构简介 &#x1f4e6; etcd 在 Milvus 中的核心作用 &#x1f527; 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...

深入理解 C++ 左值右值、std::move 与函数重载中的参数传递

在 C 编程中&#xff0c;左值和右值的概念以及std::move的使用&#xff0c;常常让开发者感到困惑。特别是在函数重载场景下&#xff0c;如何合理利用这些特性来优化代码性能、确保语义正确&#xff0c;更是一个值得深入探讨的话题。 在开始之前&#xff0c;先提出几个问题&…...