专题讨论3:基于图的基本原理实现走迷宫问题
问题描述
迷宫通常以二维矩阵形式呈现,矩阵中的元素用 0 和 1 表示,其中 0 代表通路,1 代表墙壁 。存在特定的起点和终点坐标,目标是从起点出发,寻找一条能够到达终点的路径。
实现思路
将迷宫中的每个可通行单元格看作图中的一个节点 。如果两个可通行单元格在迷宫中相邻(上、下、左、右方向),则在对应的图节点之间建立一条边。可以使用邻接表或邻接矩阵来表示图结构。
算法概述
我将使用深度优先访问(DFS)算法来解决该问题,从起点开始,沿着一条路径不断深入探索,直至遇到死胡同或者终点。若遇到死胡同,则回溯(算法的核心就是递归遍历+回溯)到上一个未完全探索的节点,尝试其他分支路径。
算法实现
本质上是对无权无向图的 DFS 遍历:
#include <iostream>
#include <vector>
using namespace std;// 定义方向数组:上、下、左、右
const int dx[] = { -1, 1, 0, 0 };
const int dy[] = { 0, 0, -1, 1 };// DFS函数
bool dfs(int x, int y, const vector<vector<int>>& maze, vector<vector<bool>>& visited, vector<pair<int, int>>& path) {int m = maze.size();int n = maze[0].size();// 越界、碰壁或已访问过if (x < 0 || x >= m || y < 0 || y >= n || maze[x][y] == 1 || visited[x][y]) {return false;}visited[x][y] = true;path.push_back({ x, y });// 到达终点if (x == m - 1 && y == n - 1) {return true;}// 向四个方向递归搜索for (int i = 0; i < 4; ++i) {int newX = x + dx[i];int newY = y + dy[i];if (dfs(newX, newY, maze, visited, path)) {return true;}}// 回溯path.pop_back();return false;
}int main() {// 定义迷宫(0表示通路,1表示墙壁)vector<vector<int>> maze = {{0, 1, 0, 0, 0},{0, 1, 0, 1, 0},{0, 0, 0, 0, 0},{0, 1, 1, 1, 0},{0, 0, 0, 1, 0}};int m = maze.size();int n = maze[0].size();// 初始化访问标记数组vector<vector<bool>> visited(m, vector<bool>(n, false));// 存储路径vector<pair<int, int>> path;// 从起点(0,0)开始DFS搜索bool found = dfs(0, 0, maze, visited, path);// 输出结果if (found) {cout << "找到路径!路径如下:" << endl;for (const auto& p : path) {cout << "(" << p.first << ", " << p.second << ") ";}cout << endl;}else {cout << "未找到路径!" << endl;}return 0;
}
算法详细讲解
数据结构
1)方向数组 dx 和 dy;
分别表示四个方向的坐标偏移:上、下、左、右;通过与 dx[i] 和 dy[i] 组合,可以计算出从当前位置 (x,y) 移动后的新坐标。
const int dx[] = { -1, 1, 0, 0 };
const int dy[] = { 0, 0, -1, 1 };
2)访问标记数组 visited;
用来记录每个位置是否被访问过,防止重复访问。
vector<vector<bool>> visited(m, vector<bool>(n, false));
3)路径 path;
使用动态数组vector<pair<int, int>>& path 来存储坐标点。每个 pair<int, int> 表示迷宫中的一个单元格位置。通过 push_back() 和 pop_back() 来动态修改当前路径。
vector<pair<int, int>> path;
关键函数
1)DFS函数主要是用来递归+回溯。
2)主函数主要是提供迷宫,调用DFS函数。
代码运行结果展示
时间复杂度和空间复杂度
时间复杂度:
在最坏情况下,需要遍历迷宫中的每一个单元格,所以时间复杂度为O(m*n) ,其中m是迷宫的行数,n是迷宫的列数。
空间复杂度:
因为使用了递归,递归调用栈的深度最大为迷宫单元格数量(也就是全都访问的情况),所以说空间复杂度为O(m*n) 。
与栈走迷宫相比
因为之前刚学栈的时候,有做过栈走迷宫的专题讨论,当时还不是很会使用C++就用的C语言解决,处理的也比较粗糙;学完图以后,最直观的是代码段变短了。更加清晰明了,易于理解了。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>// 定义栈结构
// 数据类型:用于存储位置坐标 (x, y) 以及方向 di
typedef struct datatype {int x, y, di;
} ElemType;// 节点:栈中的每个元素由节点表示,包含数据和指向下一个节点的指针
typedef struct node {ElemType data;struct node* next;
} Node;// 栈顶指示:表示栈的结构体,包含栈中元素的数量和指向栈顶节点的指针
typedef struct stack {int count; // 记录栈中元素的数量Node* point;
} Stack;// 方向存储结构:用于存储方向的偏移量,xx 和 yy 分别表示 x 和 y 方向的偏移
typedef struct {int xx, yy;
} Direction;// 创建节点
// 该函数用于创建一个新的节点,并将传入的数据存储在节点中
Node* create_node(ElemType data) {// 为新节点分配内存Node* new_node = (Node*)malloc(sizeof(Node));if (new_node) {// 若内存分配成功,将数据赋值给新节点的数据部分new_node->data = data;// 新节点的下一个节点指针初始化为 NULLnew_node->next = NULL;return new_node;}else {// 若内存分配失败,输出错误信息printf("ERROR\n");return NULL;}
}// 初始化栈
// 该函数用于初始化栈,将栈的元素数量置为 0,栈顶指针置为 NULL
void stack_init(Stack* top) {top->count = 0;top->point = NULL;
}// 判断栈是否为空
// 该函数用于判断栈是否为空,若栈中元素数量为 0,则返回 1,否则返回 0
int isEmpty(Stack* top) {if (top->count == 0) {return 1;}return 0;
}// 入栈
// 该函数用于将一个元素压入栈中
void push(Stack* top, ElemType data) {// 创建一个新节点并存储传入的数据Node* new_node = create_node(data);if (new_node) {// 若新节点创建成功,栈中元素数量加 1top->count++;if (top->count == 1) {// 如果入栈的是第一个节点,将栈顶指针指向新节点top->point = new_node;}else {// 否则,将新节点的 next 指针指向原来的栈顶节点,再将栈顶指针指向新节点new_node->next = top->point;top->point = new_node;}}elsereturn;
}// 出栈
// 该函数用于将栈顶元素弹出栈
Node* pop(Stack* top) {Node* pop_node = NULL;if (!isEmpty(top)) {// 若栈不为空,将栈顶节点指针赋值给 pop_nodepop_node = top->point;// 将栈顶指针指向原来栈顶节点的下一个节点top->point = pop_node->next;// 栈中元素数量减 1top->count--;}return pop_node;
}// 非递归输出路径
// 该函数用于非递归地输出栈中存储的路径,避免递归可能导致的栈溢出
void show_path(Node* node) {if (!node) return;// 创建一个临时栈用于反转路径顺序Stack reversed;stack_init(&reversed);// 将原栈中的元素逐个压入临时栈,实现反转Node* current = node;while (current) {push(&reversed, current->data);current = current->next;}// 输出反转后的路径current = reversed.point;while (current) {printf("(%d,%d)\n", current->data.x, current->data.y);current = current->next;}// 释放临时栈的内存while (!isEmpty(&reversed)) {free(pop(&reversed));}
}// 检查新位置是否越界
// 该函数用于检查给定的位置 (x, y) 是否在迷宫范围内且该位置为通路(值为 0)
int isValid(int maze[][5], int x, int y) { return x >= 0 && x < 5 && y >= 0 && y < 5 && maze[x][y] == 0;
}// 判断能否走出去,路径压入栈中
// 该函数用于寻找从起点 (startx, starty) 到终点 (endx, endy) 的路径
int FindPath(int maze[][5], Stack* stack, Direction dir[], int startx, int starty, int endx, int endy) {// 确保栈指针不为空assert(stack);// 检查起点是否合法if (!isValid(maze, startx, starty)) {printf("起点不合法!\n");return 0;}int x, y, di;int line, col;// 初始化:将起点标记为已访问maze[startx][starty] = -1;// 创建起点元素并压入栈ElemType start = { startx, starty, -1 };push(stack, start);while (!isEmpty(stack)) {// 弹出栈顶元素Node* po = pop(stack);ElemType temp = po->data;x = temp.x;y = temp.y;di = temp.di; // 修正:直接使用di,不再递增// 释放弹出节点的内存free(po);// 尝试从当前方向开始探索所有可能的方向while (di < 4) {// 计算新位置的坐标line = x + dir[di].xx;col = y + dir[di].yy;if (isValid(maze, line, col)) {// 若新位置合法,保存当前状态并继续探索temp = { x, y, di };push(stack, temp);// 更新当前位置x = line;y = col;// 标记新位置为已访问maze[line][col] = -1;// 检查是否到达终点if (x == endx && y == endy) {// 到达终点,将终点压入栈并返回成功temp = { x, y, -1 };push(stack, temp);return 1;}// 从新位置重新开始探索所有方向di = 0;}else {// 尝试下一个方向di++;}}}// 栈为空,说明没有找到路径return 0;
}int main() {// 定义一个 5x5 的迷宫矩阵,1 表示墙,0 表示通路int maze[5][5] = {{0, 1, 0, 0, 0},{0, 1, 0, 1, 0},{0, 0, 0, 0, 0},{0, 1, 1, 1, 0},{0, 0, 0, 1, 0}};// 定义并初始化栈Stack stack;stack_init(&stack);// 方向数组:分别表示右、下、左、上四个方向的偏移量Direction directions[4] = { {0,1}, {1,0}, {0,-1}, {-1,0} };// 调用 FindPath 函数寻找路径,并输出是否找到路径的结果// 修改起点为(0,0),终点为(4,4)以匹配迷宫布局printf("能否走出去:%d\n", FindPath(maze, &stack, directions, 0, 0, 4, 4));// 若找到路径,输出路径show_path(stack.point);// 释放栈中所有节点的内存,防止内存泄漏while (!isEmpty(&stack)) {free(pop(&stack));}return 0;
}
代码运行展示
这次使用了递归调用的思想,而之前则是手动实现栈结构,通过用循环来模拟递归的过程,所以说之前的代码会很冗长。
学习心得
pair --标准库模板类的学习!!
pair 的主要作用是将两个不同类型的值组合成一个单元。// 存储一对相关的值,例如坐标点(x, y)、键值对等。
基本结构
template <class T1, class T2>
struct pair {T1 first; // 第一个值T2 second; // 第二个值
};
特点
1)简洁性:直接用 pair 存储坐标,无需额外定义结构体。
2)高效性:pair 是轻量级的,访问 first 和 second 的开销极小。
3)适配容器:vector 可以方便地存储和管理 pair 对象。
用法示例
#include <iostream>
#include <vector>
using namespace std;int main() {vector<pair<int, int>> path;// 添加坐标点path.push_back({0, 0}); // 起点 (0, 0)path.push_back({0, 1}); // 向右移动path.push_back({1, 1}); // 向下移动// 遍历路径并打印每个点for (const auto& p : path) {cout << "(" << p.first << ", " << p.second << ") ";}// 输出:(0, 0) (0, 1) (1, 1)return 0;
}
以上代码展示了如何使用 pair 存储坐标,并遍历路径。
在我的代码段中的运用
在我的代码段中,vector<pair<int, int>>& path 是一个用来存储坐标点的动态数组。每个 pair<int, int> 表示迷宫中的一个单元格位置:
first:对应单元格的行坐标(x)。
second:对应单元格的列坐标(y)。
path.push_back({x, y}) 则会将当前坐标 (x, y) 作为一个 pair 对象添加到路径中。
今天的分享就到这里啦~~
相关文章:
专题讨论3:基于图的基本原理实现走迷宫问题
问题描述 迷宫通常以二维矩阵形式呈现,矩阵中的元素用 0 和 1 表示,其中 0 代表通路,1 代表墙壁 。存在特定的起点和终点坐标,目标是从起点出发,寻找一条能够到达终点的路径。 实现思路 将迷宫中的每个可通行单元格…...
Linux基础第四天
系统之间文件共享 想要实现两个不同的系统之间实现文件共享,最简单的一种方案就是设置VMware软件的共享文件夹,利用共享文件夹可以实现linux系统和windows系统之间的文件共享,这样就可以实现在windows系统上编辑程序,然后在linux系…...
eNSP中单臂路由器配置完整实验及命令解释
单臂路由器(Router on a Stick)是一种通过单个物理接口处理多个VLAN间路由的解决方案 单臂路由器通过以下方式工作: 交换机端口配置为Trunk模式,允许多个VLAN流量通过路由器子接口为每个VLAN创建虚拟接口每个子接口配置对应VLAN…...
TeaType 奶茶性格占卜机开发记录:一场俏皮的 UniApp 单页奇遇
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 最近我突发奇想,想用 UniApp 做一个轻松又俏皮的小工具,叫做「TeaType 奶茶性格占卜机」…...
AI神经网络降噪 vs 传统单/双麦克风降噪的核心优势对比
1. 降噪原理的本质差异 对比维度传统单/双麦克风降噪AI神经网络降噪技术基础基于固定规则的信号处理(如谱减法、维纳滤波)基于深度学习的动态建模(DNN/CNN/Transformer)噪声样本依赖预设有限噪声类型训练数据覆盖数十万种真实环境…...
【Nginx学习笔记】:Fastapi服务部署单机Nginx配置说明
服务部署单机Nginx配置说明 服务.conf配置文件: upstream asr_backend {server 127.0.0.1:8010; }server {listen 80;server_name your_domain.com;location / {proxy_pass http://localhost:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remot…...
JAVA Web 期末速成
一、专业术语及名词 1. Web 的特点 定义:web 是分布在全世界,基于 HTTP 通信协议,存储在 Web 服务器中的所有相互链接的超文本集 Web 是一种分布式超媒体系统Web 是多媒体化 和 易于导航的Web 与平台无关Web 是动态、交互的 2. TCP/IP 结…...
iOS:重新定义移动交互,引领智能生活新潮流
在当今智能手机与移动设备充斥的时代,操作系统作为其 “灵魂”,掌控着用户体验的方方面面。iOS 系统,这一由苹果公司精心雕琢的杰作,自诞生起便以独特魅力与卓越性能,在移动操作系统领域独树一帜,深刻影响着…...
LabVIEW数据库使用说明
介绍LabVIEW如何在数据库中插入记录以及执行 SQL 查询,适用于对数据库进行数据管理和操作的场景。借助 Database Connectivity Toolkit,可便捷地与指定数据库交互。 各 VI 功能详述 左侧 VI 功能概述:实现向数据库表中插入数据的操作。当输入…...
Linux多进程 写时拷贝 物理地址和逻辑地址
如果不采用写时拷贝技术 直接fork子进程 会发生什么? 如上图所示 橙色为父进程所占内存空间 绿色为子进程所占内存空间。 如果子进程只是需要做出一点点和父进程不一样的 其余和父进程均为相同 第一 就会出现复制开销比较大;第二占用内存空间 所以 …...
在 CentOS 7.9 上部署 node_exporter 并接入 Prometheus + Grafana 实现主机监控
文章目录 在 CentOS 7.9 上部署 node_exporter 并接入 Prometheus Grafana 实现主机监控环境说明node_exporter 安装与配置下载并解压 node_exporter创建 Systemd 启动服务验证服务状态验证端口监听 Prometheus 配置 node_exporter 监控项修改 prometheus.yml重新加载 Prometh…...
Java 反射(Reflection)技术
反射是 Java 提供的一种强大机制,允许程序在运行时(Runtime)动态地获取类的信息、操作类的属性和方法。这种能力使得 Java 程序可以突破编译时的限制,实现更灵活的设计。 一、反射的核心概念 1. 什么是反射 反射是指在程序运行…...
【SpringBoot】从零开始全面解析SpringMVC (三)
本篇博客给大家带来的是SpringBoot的知识点, 本篇是SpringBoot入门, 介绍SpringMVC相关知识. 🐎文章专栏: JavaEE进阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,…...
DeerFlow安装配置及使用案例
DeerFlow安装配置及使用案例 简介 DeerFlow项目由字节跳动技术团队发起和主导开发,作为一个开源深度研究框架,于2025年年初正式开源。该项目基于LangStack生态,构建于LangChain与LangGraph的开源技术栈之上,充分利用语言模型…...
吉林省建筑工程专业技术人员职称评审实施办法
吉林省人力资源和社会保障厅 吉林省建筑工程专业技术人员职称评审实施办法 吉林省建筑工程技术人才之技术员评审条件 吉林省建筑工程技术人才之助理工程师评审条件 吉林省建筑工程技术人才之工程师评审条件 吉林省建筑工程技术人才之高级工程师评审条件 吉林省建筑工程技术人才…...
React组件开发流程-03.1
此章先以一个完整的例子来全面了解下React组件开发的流程,主要是以代码为主,在不同的章节中会把重点标出来,要完成的例子如下,也可从官网中找到。 React组件开发流程 这只是一个通用流程,在熟悉后不需要完全遵从。 …...
Vue 中 v-model 的三种使用方式对比与实践
在 Vue 3 中,v-model 是组件双向数据绑定的核心特性。随着 Vue 的版本演进,v-model 的使用方式也在不断优化。本文将基于您提供的代码示例,详细分析三种不同的 v-model 实现方式:基础用法、useVModel Hook(vueuse/core…...
Adminer:一个基于Web的轻量级数据库管理工具
Adminer 是一个由单个 PHP 文件实现的免费数据库管理工具,支持 MySQL、MariaDB、PostgreSQL、CockroachDB、SQLite、SQL Server、Oracle、Elasticsearch、SimpleDB、MongoDB、Firebird、Clickhouse 等数据库。 Adminer 支持的主要功能如下: 连接数据库服…...
Linux笔记---内核态与用户态
用户态(User Mode) 权限级别:较低,限制应用程序直接访问硬件或关键系统资源。 适用场景:普通应用程序的运行环境。 限制:无法执行特权指令(如操作I/O端口、修改内存管理单元配置等)…...
MFC 编程中 OnInitDialog 函数
核心作用 对话框初始化入口 :创建完成后第一个执行的函数。是对话框的起点。控件操作安全期 :此时所有控件已创建完成。可以安全地进行控件的初始化、属性设置等操作。界面布局最佳时机 :窗口显示前完成初始化设置。可以进行布局调整、数据初…...
Java高频面试之并发编程-18
hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶 面试官:详细说说synchronized synchronized 是 Java 中实现线程同步的核心关键字,用于解决多线程环境下的资源竞争…...
深入探究AKS Workload Identity
Azure Kubernetes 服务 (AKS) 提供了一项名为 Workload Identity 的强大功能,它可以增强安全性并简化在 Kubernetes 集群中运行的应用程序的身份验证。以下是 Workload Identity 在 AKS 环境中的工作原理概述: AKS 中的 Workload Identity 允许 Pod 无需…...
【MySQL基础】MySQL基础:MySQL基本操作与架构
MySQL学习: https://blog.csdn.net/2301_80220607/category_12971838.html?spm1001.2014.3001.5482 前言: 这里是MySQL学习的第一篇,本篇主要是讲解一些MySQL的基础操作,但这并不是重点,本篇我们主要是要理解MySQL…...
【线下沙龙】NineData x Apache Doris x 阿里云联合举办数据库技术Meetup,5月24日深圳见!
5月24日下午,NineData 将联合 Apache Doris、阿里云一起,在深圳举办数据库技术Meetup。本次技术沙龙聚焦「数据实时分析」与「数据同步迁移」 两大核心领域,针对企业数据战略中的痛点,特邀行业资深技术大咖,结合多年技…...
【Unity网络编程知识】Unity的 UnityWebRequest相关类学习
1、UnityWebRequest类介绍 UnityWebRequest是一个unity提供的一个模块化的系统类,用于构成HTTP请求和处理HTTP响应,它主要目标是让unity游戏和Web服务端进行交互,它将之前WWW的相关功能都集成在了其中,所以新版本中都建议使用unit…...
STM32实战指南——DHT11温湿度传感器驱动开发与避坑指南
知识点1【DHT11的概述】 1、概述 DHT是一款温湿度一体化的数字传感器(无需AD转换)。 2、驱动方式 通过单片机等微处理器简单的电路连接就能实时采集本地湿度和温度。DHT11与单片机之间采用单总线进行通信,仅需要一个IO口。 相对于单片机…...
SVG 与 Canvas 技术调研对比
在 画布 中进行 大量矩形框绘制 时,SVG 和 Canvas 都是可行的技术方案,但它们适用于不同的场景,技术特性也有明显区别。下面我从性能、灵活性、可维护性、适用场景等方面做一个系统性的对比,帮助你做出更合适的选择。 ᾞ…...
Ubuntu 远程桌面配置指南
概述: 本文主要介绍在Ubuntu 22.04中通过VNC实现远程连接的方法。首先需安装图形化界面和VNC工具x11vnc,设置开机启动服务;然后在Windows客户端用VNC Viewer通过局域网IP和端口5900连接。 总结: 一、VNC配置与安装 安装图形化界面 在Ubuntu 22.04中需先安装: sudo apt …...
146. LRU 缓存
一、题目 二、思路 题目要求 O(1) 的平均时间复杂度运行 -> 使用Map空间换时间 Map<Integer, Node>Map 通过 key 直接找到对应节点 getNode(key) -> Node记得只要查过该节点之后就应该把该节点放到最前面 pushFront(Node)put 元素后,在map中添加&…...
微信学习之导航功能
先看这个功能的效果: 然后开始学习吧。 一、我们这里用的是vant的Grid控件,首先我们导入: { "usingComponents": {"van-search": "vant/weapp/search/index","my-swiper":"../../components…...
MySQL替换瀚高数据库报错: TO_DAYS()不存在(APP)
文章目录 环境症状问题原因解决方案报错编码 环境 系统平台:中标麒麟(海光)7,中标麒麟(飞腾)7 版本:4.5 症状 MySQL替换为瀚高数据库进行应用系统适配报错:TO_DAYS()不…...
FPGA:高速接口JESD204B以及FPGA实现
本文将先介绍JESD204B高速接口的基本概念和特性,然后详细说明如何基于Xilinx Kintex-7系列FPGA实现JESD204B高速接口。 一、JESD204B高速接口介绍 JESD204B是由JEDEC(固态技术协会)制定的一种高速串行通信标准,主要用于数据转换器…...
HarmonyOS Navigation组件深度解析与应用实践
HarmonyOS Navigation组件深度解析与应用实践 一、组件架构与核心能力 HarmonyOS Navigation组件作为路由导航的根视图容器,采用三层架构设计: 标题层:支持主副标题配置,提供Mini/Free/Full三种显示模式内容层:默认…...
C#中的ThreadStart委托
ThreadStart 委托: ThreadStart 是 .NET 中的一个内置委托类型,表示无参数且无返回值的方法。其定义如下: public delegate void ThreadStart(); 通常用于定义线程的入口方法。 List<ThreadStart>: 这是一个泛型集合&…...
Spring boot 集成 Knife4j
knife4j官网:https://doc.xiaominfo.com/docs/quick-start 1. 引入Knife4j相关依赖 <!-- knife4j--> <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version…...
基于Java在高德地图面查询检索中使用WGS84坐标的一种方法-以某商场的POI数据检索为例
前言 随着移动互联网的飞速发展,基于位置的服务(LBS)需求日益增长,越来越多的应用需要从地图中检索特定区域内的地理信息,例如商业场所、公共服务设施等。商场作为城市商业活动的重要载体,其周边的地理信息…...
6K型护套连接器DLJ0601(2000)-00
6K型护套连接器DLJ0601(2000)-00简介 6K型护套连接器DLJ0601(2000)-00是一种用于电气连接的组件,广泛应用于工业设备、通信系统和电子设备中。该连接器设计紧凑,具有高可靠性和耐用性,适用于多种环境条件下的电气连接需求。 主要特点 高可…...
Hexo的Next主题的Config文件内方便修改的参数(Chat-Gpt)
这是对 Hexo 的 Next 主题 _config.yml 文件各部分配置项的中文解释,帮助你更方便地进行定制: 🚀 核心设置 cache / minify cache.enable: 启用缓存,加快生成速度。minify: 是否压缩生成的 HTML/CSS/JS。 custom_file_path 自…...
【three】给立方体的每个面加载不同贴图
效果图: 主要代码: initCube() {let _this thisconst geometry new Three.BoxGeometry(1, .3, .5)let TextureLoader new Three.TextureLoader()let mater1TextureLoader.load(require(/assets/images/bg2.jpg),function (texture){console.log(tex…...
vscode怎么关闭自动定位文件
关闭自动定位文件功能 方式1 在设置中搜索: explorer.autoReveal 方式2 直接在settings.json中增加"explorer.autoReveal": false 添加类似jetbrains IDE的文件定位功能 可以直接安装插件市场搜索niushuaibing.vs-location, 安装后会有文件定位按钮, 点击后即可…...
2025-5-19Vue3快速上手
1、toRefs和toRef 当解构一个响应式对象(如 reactive 创建的对象)时,直接解构会失去响应性,此时可用 toRefs或toRef 保持响应性 toRef 的核心作用是将对象的属性转换为 ref,保持与原属性的双向绑定,无论原…...
HDMI 屏幕 电脑HDMI HDMI采集卡的关系
一、HDMI接口方向性原理 普通设备的HDMI接口方向: 电脑的HDMI接口:无论是显卡还是主板上的HDMI,均为输出端(信号源),只能向外发送视频信号,无法接收输入信号。 显示器的HDMI接口:均…...
JESD204 ip核使用与例程分析(二)
JESD204 ip核使用与例程分析(二) JESD204时钟方案专用差分时钟对例程分析jesd204_0_transport_layer_demapperjesd204_0_sig_chkjesd204_0_clockingjesd204_0 ip核port寄存器AXI-LITE寄存器配置jesd204_phy ip核JESD204时钟方案 图3-1所示为最通用、灵活的时钟解决方案。在图…...
如何使用VCS+XA加密verilog和spice网表
如果要交付verilog,但是需要对方进行VCS仿真,那么可以用以下方法: 一、基于编译指令的局部加密 适用场景:需精确控制加密范围(如仅加密核心算法或敏感逻辑)。 实现步骤: 代码标注…...
Grafana之Dashboard(仪表盘)
在前面的小节中介绍了Grafana中4中常用的可视化面板的使用,通过在面板中使用PromQL表达式,Grafana能够方便的将Prometheus返回的数据进行可视化展示。例如,在展示主机CPU使用率时,我们使用了如下表达式: 1 - (avg(ira…...
AOSP 中常见的键值对存储方式全解析(适用于系统开发与应用开发)
在 Android 系统开发(AOSP)中,键值对(Key-Value)存储是一种基础且广泛使用的数据持久化方式。从系统属性、用户设置,到应用配置,都依赖于这种结构的存储方式。本文将全面梳理 AOSP 中主流的键值…...
集合进阶2
Java不可变集合、Stream流与方法引用深度解析 一、不可变集合(Immutable Collections)进阶指南 1.1 不可变集合核心特性 防御性编程:防止外部修改数据(如传递集合给第三方库时)线程安全:天然支持多线程读…...
eMMC深度解析:嵌入式多媒体卡的硬件电路设计要点
一、eMMC 技术深度解析 1.定义与背景 eMMC(Embedded Multi Media Card)是一种专为嵌入式系统设计的非易失性存储解决方案,它将 NAND 闪存、主控芯片和接口协议封装在一个 BGA(Ball Grid Array)封装中。其核心目标是简…...
【SPIN】PROMELA语言编程入门同步机制(SPIN学习系列--4)
同步机制 PROMELA 不包含信号量、锁或监控器等常见的同步原语,而是通过语句的**可执行性(executability)**概念来建模同步机制。计算机系统的架构限制了同步机制的设计:本章主要介绍适用于共享内存系统的同步机制,第7…...
整数的个数
【描述】 给定k(1< k < 100)个正整数,其中每个数都是大于等于1,小于等于10的数。写程序计算给定的k个正整数中,1,5和10出现的次数。 【输入】 输入有两行:第一行包含一个正整数kÿ…...