当前位置: 首页 > 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 …...

用Nacos搭建微服务操作

Nacos服务搭建 我们首先在Nacos的GitHub中下载相关的安装文件。https://github.com/alibaba/nacos/releases 但是因为服务器在国外&#xff0c;所以我们直接给大家提供了对应的安装文件。直接解压缩到非中文的目录下&#xff0c;然后启动即可 服务访问的地址是&#xff1a;htt…...

ChatGPT模型采样算法详解

ChatGPT模型采样算法详解 ChatGPT所使用的模型——GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型有几个参数&#xff0c;理解它们对文本生成任务至关重要。其中最重要的一组参数是temperature和top_p。二者控制两种不同的采样技术&#xff0c;用于因果…...

【Unity3d】Unity与iOS通信

在unity开发或者sdk开发经常需要用到unity与oc之间进行交互&#xff0c;这里把它们之间通信代码整理出来。 Unity调用Objective-C 主要分三个步骤&#xff1a; (一)、在xcode中定义要被unity调用的函数 新建一个类&#xff0c;名字可以任意&#xff0c;比如UnityBridge&…...

RDD的持久化【博学谷学习记录】

RDD的缓存缓存: 一般当一个RDD的计算非常的耗时|昂贵(计算规则比较复杂),或者说这个RDD需要被重复(多方)使用,此时可以将这个RDD计算完的结果缓存起来, 便于后续的使用, 从而提升效率通过缓存也可以提升RDD的容错能力, 当后续计算失败后, 尽量不让RDD进行回溯所有的依赖链条, 从…...

Python3 正则表达式

Python3 正则表达式 正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。 Python 自1.5版本起增加了re 模块&#xff0c;它提供 Perl 风格的正则表达式模式。 re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根…...

Qt-基础

Qt1. 概念其他概念对话框模态对话框与非模态对话框事件事件拦截/过滤事件例子鼠标/屏幕使用界面功能qt-designer工具debug目录结构mainwindow控件窗口QMainWindow事件2. 项目概览QOBJECT tree 对象树3. 信号和槽信号函数关联自定义信号和槽函数自定义信号和槽函数1自定义信号和…...

ABB机器人将实时坐标发送给西门子PLC的具体方法示例

ABB机器人将实时坐标发送给西门子PLC的具体方法示例 本次以PROFINET通信为例进行说明,演示ABB机器人将实时坐标发送给西门子PLC的具体方法。 首先,要保证ABB机器人和PLC的信号地址分配已经完成,具体的内容可参考以下链接: S7-1200PLC与ABB机器人进行PROFINET通信的具体方法…...

反向传播与梯度下降详解

一,前向传播与反向传播 1.1,神经网络训练过程 神经网络训练过程是: 先通过随机参数“猜“一个结果(模型前向传播过程),这里称为预测结果 a a a;然后计算 a a a 与样本标签值...

Skywalking ui页面功能介绍

菜单栏 仪表盘&#xff1a;查看被监控服务的运行状态&#xff1b; 拓扑图&#xff1a;以拓扑图的方式展现服务之间的关系&#xff0c;并以此为入口查看相关信息&#xff1b; 追踪&#xff1a;以接口列表的方式展现&#xff0c;追踪接口内部调用过程&#xff1b; 性能剖析&am…...

哪里可以找到免费的 PDF 阅读编辑器?7 个免费 PDF 阅读编辑器分享

如果您曾经需要编辑 PDF&#xff0c;您可能会发现很难找到免费的 PDF 编辑器。幸运的是&#xff0c;您可以使用在线资源来编辑该文档&#xff0c;而无需为软件付费。 在本文中&#xff0c;我将介绍七种不同的 PDF 编辑器&#xff0c;它们至少可以让您免费编辑几个文件。我通过…...

北京交通管制信息网站/深圳网络推广平台

目录1、引入依赖2、获取方法1、引入依赖 <!-- 获取客户端信息 --> <!-- https://mvnrepository.com/artifact/eu.bitwalker/UserAgentUtils --> <dependency><groupId>eu.bitwalker</groupId><artifactId>UserAgentUtils</artifactId&…...

用什么软件做动漫视频网站/宁波网络营销推广公司

一、for语句 (1)、语句结构 for 定义变量 do 使用变量执行动作 done 结束标志(2)、示例 格式1 seq&#xff08;启始值&#xff0c;间隔值&#xff0c;最终值&#xff09; for WESTOS in $(seq 1 2 10) do echo $WESTOS done格…...

上海知名的网站建设公/最近七天的新闻重点

学习 jBPM 的第一步&#xff0c;是学习它的 workbench。 workbench 是 jBMP 的基于 web 的一系列工具集&#xff0c;也就是你用 ant start.demo 起起来的那个服务器。一旦启动了 workbench&#xff0c;你就可以用 http://localhost:8080/jbpm-console/来访问它。 Workbench 主…...

网站建站手机/淘宝如何提升关键词排名

文章目录1.一层感知机结构输出数学推导代码测试2.多层感知机结构输出数学推导代码测试3.反向传播过程数学推导函数优化示例1.一层感知机结构输出 这个结构的含义是&#xff0c;n个x的输入&#xff0c;经过n个w的权值&#xff0c;进行一个线性的叠加求和∑XW得到一个输出结果x1…...

做百度网站好吗/搜索引擎营销的案例有哪些

增加超链接功能、去掉有超链接之后的红框&#xff0c;更改链接颜色&#xff01;yes&#xff01; \usepackage[backref]{hyperref} \hypersetup{ colorlinkstrue, linkcolorblack, citecolorblack }...

济南正规网站建设公司/大一网页设计作业成品免费

图论学习&#xff1a;https://blog.csdn.net/Fire_to_cheat_/article/details/80028763 关于图的几个概念定义&#xff1a; 连通图&#xff1a; 在无向图中&#xff0c;若任意两个顶点vivi与vjvj都有路径相通&#xff0c;则称该无向图为连通图。强连通图&#xff1a; 在有向图…...