c语言第一个小游戏:贪吃蛇小游戏05
贪吃蛇脱缰自动向右走:脱缰的野蛇
#include <curses.h>
#include <stdlib.h>
struct snake{
int hang;
int lie;
struct snake *next;
};
struct snake *head;
struct snake *tail;
void initNcurse()
{
initscr();
keypad(stdscr,1);
}
int hasSnakeNode(int i,int j)
{
struct snake *p;
p = head;
while(p != NULL){
if(p->hang==i && p->lie==j){
return 1;
}
p=p->next;
}
return 0;
}
void gamepic()
{
int hang;
int lie;
move(0,0);
for(hang=0;hang<20;hang++){
if(hang == 0){
for(lie=0;lie<20;lie++){
printw("--");
}
printw("\n");
}
if(hang>=0 && hang<=19){
for(lie=0;lie<=20;lie++){
if(lie==0||lie==20){
printw("|");
}else if(hasSnakeNode(hang,lie)){
printw("[]");
}
else{
printw(" ");
}
}
printw("\n");
}
if(hang == 19){
for(lie=0;lie<20;lie++){
printw("--");
}
printw("\n");
}
}
printw("by shijintao");
printw("\n");
}
void addNode()
{
struct snake *new;
new =(struct snake *)malloc(sizeof(struct snake));
new->hang=tail->hang;
new->lie=tail->lie+1;
tail->next = new;
tail = new;
new->next = NULL;
}
void initSnake()
{
struct snake *p;
while(head != NULL){
p=head;
head=head->next;
free(p);
}
head = (struct snake *)malloc(sizeof(struct snake));
head->hang=2;
head->lie=2;
head->next=NULL;
tail = head;
addNode();
addNode();
}
void deleteNode()
{
struct snake *p;
p = head;
head = head->next;
free(p);
}
void moveSnake()
{
addNode();
deleteNode();
if(tail->hang==0||tail->hang==20||tail->lie==20||tail->lie==0){
initSnake();
}
}
int main()
{
int con;
initNcurse();
initSnake();
gamepic();
while(1){
moveSnake();
gamepic();
refresh();
usleep(100000);
}
getch();
endwin();
return 0;
}
这边最主要改动的代码地方在于main函数里面的
主要是我们要先想一下如果只是一味的想让这个蛇自己往右边走(这个右边就是代码效果,也没有设置方向,就是新节点的插入导致一个向右边走的效果),肯定要把监测右方向键给去掉,然后死循环就可以实现l,不断的moveSnake(不断的addNode,deleteNode)
while(1){
moveSnake();
gamepic();
refresh();
usleep(100000);
}
原始代码中,getch() 函数的调用确实会导致屏幕刷新。这是因为 getch() 在等待用户输入时,会隐式触发一次屏幕刷新。
1. getch() 的隐式刷新机制
在 ncurses 中,getch() 不仅用于获取用户输入,还会执行以下操作:
- 刷新屏幕:在等待按键时,ncurses 会自动将当前缓冲区内容渲染到屏幕上。
- 处理输入事件:捕获用户按下的键并返回其 ASCII 码(或特殊键的编码,如方向键)。
因此,当你在循环中调用 getch() 时,即使没有显式调用 refresh(),屏幕也会被刷新。这解释了为什么你之前的代码能正常显示画面。
2. 为什么现在需要显式调用 refresh()?
在你的新代码中,循环结构发生了变化:
while(1){
moveSnake(); // 更新蛇位置
gamepic(); // 绘制画面
refresh(); // 显式刷新屏幕
usleep(100000); // 延时控制速度}
这里的关键区别是:蛇的移动不再依赖用户输入,而是通过定时器自动更新(usleep())。因此:
- 如果没有 refresh(),绘制操作(gamepic())的结果只会停留在缓冲区,无法显示。
- usleep() 是纯延时函数,不会触发屏幕刷新,必须手动调用 refresh()。
3. 两种实现方式的对比
旧代码(依赖 getch()) | 新代码(自动移动) |
蛇仅在用户按键时移动 | 蛇自动持续移动 |
getch() 隐式刷新屏幕 | 必须显式调用 refresh() |
游戏节奏由用户控制 | 游戏节奏由 usleep() 控制 |
4. 最佳实践建议
- 始终显式调用 refresh():即使在有 getch() 的场景中,显式刷新能让代码逻辑更清晰,避免依赖隐式机制。
- 分离输入处理和画面刷新:在自动移动的游戏中,用户输入(如方向键)和屏幕刷新是独立的操作,需要分别处理。
总结
原始代码之所以能正常显示,是因为 getch() 在等待输入时隐式刷新了屏幕。而在新的自动移动实现中,由于没有依赖 getch(),必须通过 refresh() 手动刷新屏幕才能看到蛇的移动效果。这是 ncurses 编程中的一个常见细节,理解它有助于写出更健壮的代码!
贪吃蛇风骚走位之支持方向变换
那么问题来了,方向的改变要监测键盘的按键需要一个while(1)循环(不断的检测用户的输入) 还有,蛇的脱缰的走也需要一个while(1)循环支持,就是这两个while(1)需要同时跑,那么我们现在单线程,就是目前无法一心二用,所以我们还做不了,需要学习多线程。
Linux多线程概念引入及编码实现
我们做贪吃蛇的时候不是要需要控制按方向键和moveSnake(脱缰的野蛇)且 要同时运行且都是要用while死循环去进行接收吗,那么我们单线程就无法做到了,这个时候要学习多线程,这样我们就是可以同时执行两个死循环。
所以我们先学习一下多线程的基本原理
想让我们先看个单线程的例子
我想通过这个单线程的返回结果,和等下多线程的返回结果做对比就很容易理解多线程的意思了;
因为在单线程环境下,函数是顺序执行的。当调用 FUNC1 时,即使里面有sleep
操作,它也只是让执行流程暂停一下,并不会切换到其他函数执行,所以会先输出this is FUNC1
,等待sleep
时间过后再继续输出this is FUNC1
。
假如现在这段代码变成了多线程
在多线程环境下,当一个线程执行到类似sleep
操作时,它会暂停执行一段时间,这时操作系统会调度其他可运行的线程。
假设存在FUNC1
和FUNC2
两个函数分别在不同线程中执行:
- 当
FUNC1
所在线程执行到sleep
时,该线程会进入休眠状态,此时操作系统会寻找其他可运行的线程,很可能就会找到FUNC2
所在线程(如果FUNC2
线程处于可运行状态),然后开始执行FUNC2
。 - 当
FUNC2
执行到类似sleep
操作后,它也会暂停,操作系统又会重新调度,此时FUNC1
线程休眠时间结束的话,可能会继续执行FUNC1
;如果FUNC1
还没结束休眠,且还有其他可运行线程,就可能会执行其他线程。
这种线程间的切换和执行顺序,取决于操作系统的线程调度机制,没有办法精确地预测哪个线程会在特定时刻执行,除非使用线程同步机制(如锁、条件变量、信号量等)来控制线程的执行顺序。例如在 Java 中,可以使用join
方法让一个线程等待另一个线程执行完毕;或者使用同步块和wait
、notify
方法来控制线程间的协作和执行顺序。
通过下面的例子学习一下
运行后是这样的 一直循环这个两句话,就是说不一定每次调用的都是一样的(在多核是同时运行,在单核是他们去争夺cpu资源),但是可以保证他们可以同时运行的(这就够了)
- #include <pthread.h> :引入 POSIX 线程库的头文件,该库用于在 C 语言中实现多线程编程,后续用到的 pthread_t 类型以及 pthread_create 等函数声明都在这个头文件中。
- func1 和 func2 是两个线程函数。它们的返回类型为 void * ,这是 POSIX 线程库中线程函数的标准返回类型要求。
- 每个函数内部都有一个无限循环 while(1) 。在循环中,先通过 printf 输出相应的提示信息("this is func1\n" 或 "this is func2\n" ),然后调用 sleep(1) 让线程暂停 1 秒钟。这使得线线程变量声明:pthread_t th1; 和 pthread_t th2; 声明了两个 pthread_t 类型的变量,pthread_t 用于标识线程,th1 和 th2 分别用来标识即将创建的两个不同线程。
- 线程创建:
- pthread_create(&th1,NULL,func1,NULL); 调用 pthread_create 函数创建了一个新线程,该线程的标识符存储在 th1 中。第二个参数 NULL 表示使用默认的线程属性;第三个参数 func1 指明这个新线程要执行的函数是 func1 ;第四个参数 NULL 表示不向 func1 函数传递额外参数 。
- 同理,pthread_create(&th2,NULL,func2,NULL); 创建了另一个线程,其标识符为 th2 ,执行函数为 func2 。
- 无限循环与程序结束:while(1); 是一个无限循环,这里的作用是防止 main 函数执行结束。因为在多线程程序中,如果主线程(main 函数所在线程)执行完毕退出,那么其他子线程也会被操作系统强制终止。通过这个无限循环,让主线程一直保持运行状态,从而使得创建的 th1 和 th2 线程能持续执行它们各自的任务。return 0; 理论上不会执行到,不过按照 main 函数的规范,需要有返回值声明。
整体功能
这段代码实现了一个简单的多线程程序,创建了两个线程分别执行 func1 和 func2 函数,这两个线程会并发地不断打印各自的提示信息并间隔 1 秒。但代码存在一些不足,比如没有对线程的返回值进行处理,也没有合理的方式来终止线程或主线程,实际应用中可以进一步完善,比如添加信号处理机制来结束程序等 。
- 程会不断重复打印信息并间隔 1 秒。
相关文章:
c语言第一个小游戏:贪吃蛇小游戏05
贪吃蛇脱缰自动向右走:脱缰的野蛇 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake *head; struct snake *tail; void initNcurse() { initscr(); keypad(stdscr,1); } int …...
ES6中的解构
在 JavaScript(包括 TypeScript)中,数组解构和对象解构是 ES6 引入的两个非常实用的语法特性,它们可以帮助我们更方便地从数组或对象中提取数据。 一、数组解构(Array Destructuring) 📌 基本用…...
Pycharm的终端执行allure命令出现command not found
Pycharm的接口自动化项目用的是venv虚拟环境,已下载和配置好Allure路径,查看Allure版本正常。 问题:在重新打开Pycham的项目时,在Pycharm终端中执行allure相关命令就会报错zsh: allure: command not found 原因:在PyC…...
[ctfshow web入门] web72
信息收集 下载index.php并查看,和上题差不多 error_reporting(0); ini_set(display_errors, 0); // 你们在炫技吗? if(isset($_POST[c])){$c $_POST[c];eval($c);$s ob_get_contents();ob_end_clean();echo preg_replace("/[0-9]|[a-z]/i",…...
【Folium】使用离线地图
文章目录 相关文献离线地图下载Folium 使用离线地图 相关文献 Folium — Folium 0.19.5 documentationOffline Map Maker 离线地图下载 我们使用 Offline Map Maker 进行地图下载。 特别注意:Folium 默认支持 WGS84 坐标系,建议下载 WGS84 坐标系的地…...
嵌入式自学第二十天(5.13)
(1)线性表顺序存储的优缺点: 优点:无需为表中逻辑关系添加额外存储空间; 可以快速随机访问元素,时间复杂度O(1)。 缺点:插入删除需要移动元素O(n); 无法动态存储。 …...
ThingsBoard3.9.1 MQTT Topic(4)
本章中的主题适用于网关设备。 1.网关订阅设备属性的topic:v1/gateway/attributes/response 订阅后接收到的响应格式。 { "id":3, "device":"m1", "values":{ "version":"V1.2"…...
centos中JDK_PATH 如何设置
在 CentOS 7.9 中设置 JDK_PATH(即 JAVA_HOME)的步骤如下。JAVA_HOME 是一个环境变量,用于指向 Java 开发工具包(JDK)的安装路径。 1. 查找 JDK 安装路径 首先,你需要找到 JDK 的安装路径。可以通过以下命…...
一次讲清 FP32 / FP16 / BF16 / INT8 / INT4
一次讲清 FP32 / FP16 / BF16 / INT8 / INT4 目标:让你3 分钟读懂格式原理,5 分钟学会选型。 只记一句:“指数定范围,尾数定精度;位宽定显存,硬件定成本”。 1 | 为什么要有这么多格式? …...
PH热榜 | 2025-05-13
1. FirstQuadrant 标语:通过以人为本的人工智能来最大化B2B销售 介绍:销售人工智能,帮助创始人和收益团队提高效率,保持组织有序,并促成更多交易。它通过简化销售幕后工作,确保每个细节都不会遗漏。 产品…...
java基础-泛型
文章目录 目录 文章目录 前言 一、泛型的作用 1.类型安全 2.通用性 这里再举个例子 二、泛型的实现 1.泛型类 2.泛型接口 3.泛型方法 4.T符号的起源(额外) 三、泛型擦除 四、泛型通配符 1.上界通配符( ) 为什么用于…...
对抗帕金森:在疾病阴影下,如何重掌生活主动权?
帕金森病,一种影响全球超 1000 万人的神经退行性疾病,正无声地改变着患者的生活轨迹。随着大脑中多巴胺分泌减少,患者逐渐出现肢体震颤、肌肉僵硬、步态迟缓等症状,甚至连扣纽扣、端水杯这类日常动作都变得艰难。更棘手的是&#…...
网络协议与系统架构分析实战:工具与方法全解
网络协议与系统架构分析实战:工具与方法全解 在互联网系统的开发、运维与安全分析中,协议解析与抓包分析是不可或缺的核心技能。本文将系统梳理主流协议解析工具、协议自动识别方案,并结合实际抓包案例,讲解如何还原和推测底层系…...
使用PocketFlow构建Web Search Agent
前言 本文介绍的是PocketFlow的cookbook中的pocketflow-agent部分。 回顾一下PocketFlow的核心架构: 每一个节点的架构: 具体介绍可以看上一篇文章: “Pocket Flow,一个仅用 100 行代码实现的 LLM 框架” 实现效果 这个Web S…...
基于STM32、HAL库的TLV320AIC3204IRHBR音频接口芯片驱动程序设计
一、简介: ADAU1701JSTZ-RL 是一款高性能音频编解码器 (Codec),专为便携式和低功耗应用设计。它集成了 ADC、DAC、麦克风前置放大器、耳机放大器和数字信号处理功能,支持 I2S/PCM 音频接口和 I2C 控制接口,非常适合与 STM32 微控制器配合使用。 二、硬件接口: 典型的 ST…...
轻量级高性能推理引擎MNN 学习笔记 02.MNN主要API
1. MNN 主要API 注意:本学习笔记只介绍了我在学习过程中常用的API ,更多MNN API 请参考官方文档。 1.1. 推理时操作流程 创建Interpreter : createFromFile()通过Interpreter创建Session :createSession()设置输入数据: getSes…...
STM32 ADC 模数转换器详解:原理、配置与应用
STM32 ADC 模数转换器详解:原理、配置与应用 在嵌入式系统中,模数转换(ADC)是实现传感器信号采集、信号处理等任务的关键环节。STM32 微控制器作为一款功能强大的 32 位微控制器,其内置的 ADC 模块为开发者提供了高效…...
18.Excel数据透视表:第1部分创建数据透视表
一 什么是数据透视表 通过万花筒可以用不同的方式査看里面画面图像,在excel中可以将数据透视表看作是对准数据的万花筒,用不同角度去观察数据,也可以旋转数据,对数据进行重新排列,对大量的数据可以快速的汇总和建立交叉…...
AI 模型训练轻量化技术在军事领域的实战应用与技术解析
AI 模型训练轻量化技术在军事领域的实战应用与技术解析 一、引言 在人工智能与军事领域深度融合的当下,AI 模型训练轻量化技术正成为破解战场资源限制的关键钥匙。通过模型压缩、量化、剪枝等核心技术,轻量化模型在算力受限、通信不稳定的复杂战场环境中…...
科学养生,开启健康生活
在快节奏的现代生活中,健康养生成为人们关注的焦点。科学合理的养生方式,无需依赖传统医学理论,也能有效提升生活质量,为身体注入活力。 均衡饮食是养生的基础。每天应保证摄入足够的蛋白质、碳水化合物和脂肪,同时…...
高效跨平台文件传输与管理的工具
软件介绍 这款名为 Coolmuster Mobile Transfer 的工具是一款多平台支持的文件传输工具,能高效地在不同设备间进行文件传输与管理。 适用场景 它适用于多种场景,无论是个人文件整理、家庭成员间资料共享,还是企业场景下的工作文件处理&…...
如何优化 Linux 服务器的磁盘 I/O 性能
# 优化 Linux 服务器磁盘 I/O 性能的全面指南 ## 1. 识别 I/O 瓶颈 首先确定是否存在 I/O 瓶颈以及瓶颈位置: bash # 使用 iostat 查看磁盘 I/O 统计 iostat -x 1 # 使用 iotop 查看进程级 I/O 使用情况 iotop # 使用 vmstat 查看系统整体 I/O 情况 vmstat 1 …...
Python基础学习-Day23
目录 基础概念转换器(transformer)估计器(estimator)管道(pipeline) 实例pipeline 基础概念 pipeline在机器学习领域可以翻译为“管道”,也可以翻译为“流水线”,是机器学习中一个重…...
【Ubuntu】扩充磁盘大小
sudo apt-get install gparted 安装完成后,搜索gparted软件,打开gparted 参考...
数据治理域——日志数据采集设计
摘要 本文主要介绍了Web页面端日志采集的设计。首先阐述了页面浏览日志采集,包括客户端日志采集的实现方式、采集内容及技术亮点。接着介绍了无线客户端端日志采集,包括UserTrack的核心设计、移动端与浏览器端采集差异以及典型应用场景崩溃分析。最后探…...
Dinky 安装部署并配置提交 Flink Yarn 任务
官方文档 https://www.dinky.org.cn/docs/1.1/deploy_guide/normal_deploy 版本 dinky 1.1.0、1.2.3 当前最新发布版本为 1.2.3 ,但是官方文档最新稳定版为 1.1 ,所以先选择 1.1.0,验证通过后,再尝试 1.2.3 ,发现 1…...
杰理-701-手表sdk无法电脑连接经典蓝牙
杰理-701-手表sdk无法电脑连接经典蓝牙 只有手机可以连接经典蓝牙播放音乐,电脑无法连接,需要关闭emitter功能 交流q群:187115320...
Timsort 算法
文章目录 1 基础理解1.1 定义和原理1.2 工作原理 2 算法实现2.1 Python 代码实现2.1.1 代码2.1.2 核心逻辑计算最小运行长度(calc_min_run(n))插入排序(insertion_sort(arr, left, right)) 2.2 Java 代码实现2.3 C 代码实现 3 逻辑…...
Go构建高并发权重抽奖系统:从设计到优化全流程指南
引言:为何需要专业抽奖系统? 在现代互联网应用中,抽奖系统被广泛用于营销活动、用户激励等场景。一个好的抽奖系统需要满足: 公平性:确保概率分布准确高性能:支持高并发抽奖请求安全性:防止作…...
深度学习计算
深度学习的飞速发展离不开强大的计算能力支撑。从张量计算到 GPU 加速,从自动微分到分布式计算,深度学习计算的每一项技术都如同精密仪器中的关键齿轮,推动着模型性能的不断提升。本文深入剖析深度学习计算的核心技术、优化策略以及前沿趋势&…...
【Bluedroid】蓝牙 HID DEVICE 初始化流程源码解析
本文深入剖析Android蓝牙协议栈中HID设备(BT-HD)服务的初始化与启用流程,从接口初始化、服务掩码管理、服务请求路由到属性回调通知,完整展现蓝牙HID服务激活的技术路径。通过代码逻辑梳理,揭示服务启用的核心机制&…...
Kotlin 中的 Unit 类型的作用以及 Java 中 Void 的区别
在 Kotlin 中,Unit 类型和 Java 中的 void 关键字都用于表示“没有返回值”的函数,但它们在设计理念、类型系统和实际使用中有显著的区别。 1 Kotlin 中的 Unit 类型 表示无返回值: 当函数不返回有意义的值时,Kotlin 使用 Unit …...
Gemini 2.5 推动视频理解进入新时代
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
Spark Streaming 内部运行机制详解
核心思想:将实时数据流切割为“微批次”,利用 Spark Core 的批处理能力进行准实时计算。 1. 核心流程拆解 数据接收(Input Data Stream) 输入源:Kafka、Flume、Socket 等实时数据流。 接收器(Receiver&…...
Feign+Resilience4j实现微服务熔断机制:原理与实战
引言:为什么需要熔断器? 在微服务架构中,服务间的依赖调用变得非常普遍。想象一下这样的场景:订单服务依赖支付服务,支付服务又依赖银行网关服务。如果银行网关服务出现故障,故障会向上蔓延,导…...
什么是SparkONYarn模式
1. 什么是 Spark on YARN? Spark on YARN 是 Apache Spark 的一种部署模式,允许 Spark 应用程序在 Hadoop YARN 集群上运行,充分利用 YARN 的资源管理和调度能力。这种模式将 Spark 与 Hadoop 生态深度集成,使企业能够在同一集群…...
鸿蒙北向应用开发: deveco5.0 创建开源鸿蒙项目
本地已经安装deveco5.0 使用5.0创建开源鸿蒙项目 文件->新建->新建项目 直接创建空项目,一路默认 next 直接编译项目 直接连接开源鸿蒙5.0开发板编译会提示 compatibleSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the dev…...
操作系统:内存管理
目录 1、主要目标 2、核心概念和技术 2.1 物理内存与虚拟内存 2.2 内存分页机制 2.3 页面置换算法 3、监控与性能优化 3.1 查看物理内存 3.2 查看虚拟内存 3.3 性能问题 1> 内存不足(OOM) 2> 内存泄漏 3> 内存碎片 3.4 性能优化策…...
腾讯优化DeepSeek的DeepEP通信框架:开启AI大模型训练新时代
事件背景 在人工智能(AI)技术迅猛发展的当下,大规模AI模型训练的需求与日俱增。高效的数据通信成为了提升AI模型训练效率的关键环节。混合专家模型(MoE)作为一种高效的大模型架构,通过动态分配专家网络处理…...
CSP-J普及组第一轮真题单选题专项训练(二)
CSP-J普及组第一轮真题单选题专项训练(二) (共15题,每2分,共30分;每题有且有一个正确选项) 1、一个 32 位整型变量占用()个字节。 A. 32 B. 128 C. 4 D. 8 2、在内存储器中每个存储单元都被赋予一个唯一的序号,称为 A、下标 B、序号 C、地址 D、编号 3、编译器的主要…...
Android加固工具测评:易盾、顶象、360加固哪款更好用?
应用安全已经成为每个开发者和企业关注的核心问题。随着黑客技术的不断升级,单一的安全措施已经无法有效应对各种复杂的攻击威胁。Android加固工具应运而生,成为了提升应用安全的关键利器。这些加固工具通过代码混淆、加密、防篡改等技术手段,…...
C++ 字符格式化输出
文章目录 一、简介二、实现代码三、实现效果 一、简介 这里使用std标准库简单实现一个字符格式化输出,方便后续的使用,它有点类似Qt中的QString操作。 二、实现代码 FMTString.hpp #pragma once#include <cmath> #include <cstdio> #include…...
内存中的“BANK”
一、BANK的定义与物理结构 基本概念 BANK(存储体) 是内存芯片内部的一个逻辑或物理分区,每个BANK由存储单元阵列、地址解码电路和缓冲器组成,用于分块管理内存操作。 作用:通过并行操作减少访问冲突,提升内…...
D-Pointer(Pimpl)设计模式(指向实现的指针)
Qt 的 D-Pointer(Pimpl)设计模式 1. Pimpl 模式简介 Pimpl(Pointer to Implementation)是一种设计模式,用于将类的接口与实现分离,从而隐藏实现细节,降低编译依赖,提高代码的可维护…...
XA协议和Tcc
基于 XA 协议的两阶段提交 (2PC)。这是一种分布式事务协议,旨在保证在多个参与者(通常是不同的数据库或资源管理器)共同参与的事务中,所有参与者要么都提交事务,要么都回滚事务,从而维护数据的一致性。 你…...
我们该如何使用DeepSeek帮我们减负?
在当今信息爆炸的时代,如何快速获取、筛选和分析信息已经成为各行各业的重要能力。而DeepSeek作为一种先进的智能搜索和信息挖掘工具,能够帮助用户快速找到所需的信息,并从海量数据中提取出有用的洞见。在这篇博文中,我们将深入探…...
25.5.13
感觉很久没有写算法题了,先来个滑动队列模板题试试水,就是用双端队列来实现会很方便,拿结构体来记录是第几个数和数的值即可,再定义两个双端队列,一个使他的值单调递增一个使他的值单调递减 使队头元素为最大值或者是最…...
软件测试——面试八股文(入门篇)
今天给大家分享软件测试面试题入门篇,看看大家能答对几题 一、 请你说一说测试用例的边界 参考回答: 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下ÿ…...
脑机接口技术:开启人类与机器融合的新时代
摘要 脑机接口(BCI)技术作为一项前沿科技,正在逐步打破人类与机器之间的沟通障碍,为医疗、娱乐、教育等多个领域带来前所未有的变革。本文将详细介绍脑机接口技术的基本原理、发展现状、应用场景以及面临的挑战和未来发展趋势&…...
当三维地理信息遇上气象预警:电网安全如何实现“先知先觉”?
极端天气频发的当下,一场台风、一次暴雨就可能让电力系统陷入瘫痪。但你知道吗?如今的电网已能通过三维地理信息与气象数据的深度融合,在灾害来临前精准锁定风险,甚至将停电事故减少七成以上。这背后,正是国网电力空间…...