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

用C++模拟流感传播:从信息学奥赛题到理解传染病模型(附完整代码)

用C模拟流感传播从信息学奥赛题到理解传染病模型附完整代码流感传播模型一直是计算机模拟和算法竞赛中的经典问题。这道来自信息学奥赛的题目不仅考察了递推算法的应用更让我们得以一窥传染病传播的基本原理。本文将带你从零开始实现这个模型并探讨其背后的现实意义。1. 问题分析与建模思路这道题目描述了一个n×n的网格状宿舍区每个格子代表一个房间可能是健康人.、空房间#或流感患者。每天流感患者会传染给相邻的健康人空房间不受影响。我们需要计算第m天时的患病人数。这种网格模型在传染病学中被称为元胞自动机模型它将空间离散化为网格每个网格单元的状态根据简单规则随时间演变。这种模型虽然简化却能展现复杂系统的涌现行为。1.1 关键问题拆解要实现这个模拟我们需要解决几个核心问题状态表示如何存储每天每个房间的状态状态转移如何根据前一天的状态计算当天的状态边界处理如何处理网格边缘的房间缺少某些邻居时间控制如何控制模拟的天数1.2 两种实现思路对比方法数据结构优点缺点适用场景三维数组a[day][row][col]每天状态独立存储逻辑清晰内存消耗大需要历史状态分析二维数组a[row][col]内存效率高需要临时标记新感染者仅需最终结果2. 三维数组实现详解让我们先看使用三维数组的解决方案这种方法更直观适合理解状态转移过程。#include bits/stdc.h using namespace std; char a[105][105][105]; // 天、行、列 int n, m, cnt 0; int main() { cin n; for(int i 1; i n; i) { for(int j 1; j n; j) { cin a[1][i][j]; // 初始化第1天状态 } } cin m; // 模拟每一天的传播 for(int day 2; day m; day) { for(int i 1; i n; i) { for(int j 1; j n; j) { a[day][i][j] a[day-1][i][j]; // 复制前一天状态 if(a[day][i][j] .) { // 如果是健康人 // 检查四个方向的邻居 if(a[day-1][i-1][j] || a[day-1][i1][j] || a[day-1][i][j-1] || a[day-1][i][j1] ) { a[day][i][j] ; // 被感染 } } } } } // 统计最终感染人数 for(int i 1; i n; i) { for(int j 1; j n; j) { if(a[m][i][j] ) cnt; } } cout cnt; return 0; }注意实际编码时需要考虑数组越界问题。上述代码简化了边界检查完整实现应该处理网格边缘情况。2.1 边界处理的正确方式正确的边界检查应该在访问数组前判断索引是否有效// 检查上邻居是否感染 if(i 1 a[day-1][i-1][j] ) { infected true; } // 检查下邻居 if(i n a[day-1][i1][j] ) { infected true; } // 类似处理左右邻居...3. 优化版二维数组实现三维数组虽然直观但内存消耗较大。我们可以优化为二维数组使用临时标记表示新感染者。#include bits/stdc.h using namespace std; char a[105][105]; int n, m, cnt 0; int main() { cin n; for(int i 1; i n; i) { for(int j 1; j n; j) { cin a[i][j]; } } cin m; for(int day 2; day m; day) { // 第一阶段标记新感染者 for(int i 1; i n; i) { for(int j 1; j n; j) { if(a[i][j] .) { if((i 1 a[i-1][j] ) || (i n a[i1][j] ) || (j 1 a[i][j-1] ) || (j n a[i][j1] )) { a[i][j] *; // 临时标记新感染 } } } } // 第二阶段更新新感染者状态 for(int i 1; i n; i) { for(int j 1; j n; j) { if(a[i][j] *) { a[i][j] ; } } } } // 统计结果 for(int i 1; i n; i) { for(int j 1; j n; j) { if(a[i][j] ) cnt; } } cout cnt; return 0; }这种实现的关键点在于使用*临时标记当天被感染的人分两个阶段处理先标记所有新感染者再统一更新状态避免了三维数组的内存开销4. 从算法到现实模型这个简单的模拟实际上反映了传染病学中SI模型的基本思想。在SI模型中S代表易感者(Susceptible)I代表感染者(Infectious)4.1 模型参数与现实对应模型参数题目对应现实意义感染概率固定为1实际疾病传播概率感染范围四邻实际接触范围潜伏期无实际疾病的潜伏时间恢复期无患者不会恢复4.2 模型扩展思路要使模型更贴近现实可以考虑以下扩展加入恢复机制感染者有一定概率恢复并免疫可变感染概率不同接触方式的感染概率不同移动性人员在不同房间间移动潜伏期感染后不会立即具有传染性// 扩展模型伪代码示例 enum Status { HEALTHY, LATENT, INFECTIOUS, RECOVERED }; struct Person { Status status; int daysInfected; // 其他属性... }; // 状态转移逻辑 void updateStatus(Person p) { if(p.status LATENT p.daysInfected INCUBATION_PERIOD) { p.status INFECTIOUS; } // 其他状态转移... }5. 调试技巧与常见问题实现这类模拟时经常会遇到一些典型问题5.1 常见错误排查表问题现象可能原因解决方法结果偏小边界未正确处理添加数组越界检查结果偏大同一天重复感染使用临时标记或三维数组无变化状态更新逻辑错误检查感染条件判断随机值未初始化数组确保数组正确初始化5.2 可视化调试技巧对于复杂模拟添加调试输出可以帮助理解程序行为// 打印某天的状态 void printDay(int day) { cout Day day :\n; for(int i 1; i n; i) { for(int j 1; j n; j) { cout a[day][i][j]; } cout \n; } cout --------\n; } // 在模拟循环中调用 if(DEBUG_MODE) printDay(day);5.3 性能优化建议当n较大时可以考虑以下优化只跟踪变化记录每天新感染的房间只检查它们的邻居并行处理使用多线程处理不同区域位压缩用位运算表示状态减少内存占用// 位压缩示例 uint8_t roomStatus[MAX_N][MAX_N/8]; // 设置某房间为感染 void setInfected(int i, int j) { roomStatus[i][j/8] | (1 (j%8)); }在实际项目中这类模拟往往需要处理更大规模和更复杂的规则。这个奥赛题目为我们提供了理解传播模型的基础框架掌握了它就迈出了计算流行病学的第一步。

相关文章:

用C++模拟流感传播:从信息学奥赛题到理解传染病模型(附完整代码)

用C模拟流感传播:从信息学奥赛题到理解传染病模型(附完整代码) 流感传播模型一直是计算机模拟和算法竞赛中的经典问题。这道来自信息学奥赛的题目不仅考察了递推算法的应用,更让我们得以一窥传染病传播的基本原理。本文将带你从零…...

企业级应用如何利用Taotoken的容灾与路由能力保障AI服务高可用

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 企业级应用如何利用Taotoken的容灾与路由能力保障AI服务高可用 对于将大模型能力深度集成到关键业务流程的企业应用而言&#xff0…...

从CID到SCR:一张SD卡的‘身份证’里到底藏了多少秘密?聊聊厂商、版本与总线宽度的那些事

从CID到SCR:一张SD卡的‘身份证’里到底藏了多少秘密?聊聊厂商、版本与总线宽度的那些事 当你从抽屉里翻出一张积灰的SD卡,除了容量标签和品牌Logo,是否想过这张小塑料片里还藏着完整的"身份档案"?就像法医通…...

macOS用户必备:3步解决QQ音乐加密格式的终极转换方案

macOS用户必备:3步解决QQ音乐加密格式的终极转换方案 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转…...

如何掌握Il2CppDumper:Unity逆向工程实战指南与深度解析

如何掌握Il2CppDumper:Unity逆向工程实战指南与深度解析 【免费下载链接】Il2CppDumper Unity il2cpp reverse engineer 项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper 你是否曾面对Unity游戏的il2cpp二进制文件感到无从下手?是否在…...

探索现代媒体播放器的终极指南:免费专业播放解决方案

探索现代媒体播放器的终极指南:免费专业播放解决方案 【免费下载链接】mpv.net 🎞 mpv.net is a media player for Windows with a modern GUI. 项目地址: https://gitcode.com/gh_mirrors/mp/mpv.net 还在为Windows平台找不到一款既强大又易用的…...

终极GitHub加速解决方案:告别国内访问缓慢的完整指南

终极GitHub加速解决方案:告别国内访问缓慢的完整指南 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 对于众多国内开发…...

手把手教你用DaVinci Developer和Configurator Pro搞个‘联合作战’环境

实战指南:构建DaVinci工具链协同开发环境 在汽车电子软件开发领域,Vector公司的DaVinci工具链已成为AUTOSAR标准落地的重要支撑。对于需要同时处理软件组件(SWC)设计和ECU配置的团队而言,如何高效协同使用DaVinci Developer和Configurator Pr…...

观测taotoken在多地域请求下的路由优化与整体服务可用性表现

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观测taotoken在多地域请求下的路由优化与整体服务可用性表现 1. 引言 对于依赖大模型 API 构建在线服务的开发者而言,…...

【爱她就为她买龙虾】Open Claw 搭建使用全图文流程

❤️核心亮点❤️ 零代码门槛|全程可视化|无需手动配置环境|内置完整依赖|28 万 Tokens 额度 ༺♥༻下载地址 https://xiake.yun/api/download/package/16?promoCodeIV8E496E2F7A 🤍前言 2026 年热门的「数字员工…...

告别.osa!用PCL玩转ORB-SLAM3点云地图:保存、加载与二次开发实战

告别.osa!用PCL玩转ORB-SLAM3点云地图:保存、加载与二次开发实战 当ORB-SLAM3完成环境建图后,.osa格式的地图文件就像被锁在保险箱里的宝藏——虽然安全,却难以直接利用。本文将带你突破这一限制,通过PCL(P…...

物联网数据采集网关实战:从协议解析到边缘计算的完整指南

1. 项目概述:从“黑盒子”到“数据枢纽”的蜕变 在物联网的世界里,传感器是感知世界的“神经末梢”,而物联网网关,则是连接这些神经末梢与云端大脑的“神经中枢”。很多人觉得它像个神秘的黑盒子,插上线,数…...

告别软件切换!用uTools的超级面板和插件,5分钟搞定你的日常效率工作流

告别软件切换!用uTools的超级面板和插件,5分钟搞定你的日常效率工作流 你是否经常在多个软件之间来回切换,只为完成一个简单的任务?复制一段文字需要翻译,得先打开浏览器;截图后想提取文字,又要…...

ubuntu服务器部署ai应用如何通过taotoken实现多模型稳定调用

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Ubuntu 服务器部署 AI 应用如何通过 Taotoken 实现多模型稳定调用 在 Ubuntu 服务器上部署 AI 应用时,开发者常常面临一…...

从C++代码到机器指令:用OD和IDA手把手拆解一个简单的main函数(附寄存器图解)

从C代码到机器指令:用OD和IDA手把手拆解一个简单的main函数(附寄存器图解) 在逆向工程的世界里,理解高级语言如何转化为底层机器指令是一项基础而关键的技能。本文将以一个最简单的C main 函数为例,带你一步步追踪其从…...

5分钟实战:用Sunshine轻松搭建你的专属游戏串流服务器

5分钟实战:用Sunshine轻松搭建你的专属游戏串流服务器 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 还在为只能在书房玩游戏而烦恼吗?想不想在客厅大电视…...

告别杂音!在RK3588上搞定HDMI音频采集与实时播放的保姆级教程

告别杂音!RK3588 HDMI音频采集与实时播放的终极调优指南 当你在RK3588开发板上调试HDMI音频采集时,是否曾被突如其来的"哒哒"声搞得焦头烂额?这种高频杂音不仅影响用户体验,更可能掩盖音频流的真实质量。本文将带你深入…...

在macOS上轻松运行Windows应用:Whisky完整使用指南

在macOS上轻松运行Windows应用:Whisky完整使用指南 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 想在Apple Silicon Mac上直接运行Windows软件和游戏,又不想…...

基于RK3588S与鸿蒙系统的SOM核心板:高性能嵌入式AIoT开发实战

1. 项目概述:一颗“全能芯”的鸿蒙新载体最近在嵌入式圈子里,一个消息挺让人兴奋的:触觉智能基于瑞芯微RK3588S这颗“明星”SoC打造的SOM3588S核心板,正式支持鸿蒙系统并上市了。这不仅仅是又多了一块高性能的核心板,它…...

当金属学会“作画”——优之彩蚀刻不锈钢蜂窝板的空间艺术

让一块坚硬的金属表面呈现出山水画的意境、书法作品的笔意,或是品牌Logo的精致线条——这不是魔法,而是优之彩蚀刻不锈钢蜂窝板正在做的事。触得到的艺术,看得见的高级优之彩不锈钢蚀刻蜂窝板的最大魅力,在于它将“平面”变成了“…...

终极指南:如何免费搭建专业的电子实验室笔记本系统

终极指南:如何免费搭建专业的电子实验室笔记本系统 【免费下载链接】elabftw :notebook: eLabFTW is the most popular open source electronic lab notebook for research labs. 项目地址: https://gitcode.com/gh_mirrors/el/elabftw eLabFTW是一款功能强大…...

3个步骤,在VSCode中实现Mermaid图表实时预览的终极工作流

3个步骤,在VSCode中实现Mermaid图表实时预览的终极工作流 【免费下载链接】vscode-mermaid-preview Previews Mermaid diagrams 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-mermaid-preview 你是否曾在编写技术文档时,为了一个简单的流…...

从芯片手册到PCB:SPL06与MPU9250的I2C实战布线要点与防护设计

从芯片手册到PCB:SPL06与MPU9250的I2C实战布线要点与防护设计 在无人机飞控板的设计中,气压传感器SPL06和九轴传感器MPU9250的稳定工作直接关系到飞行姿态控制的精确性。本文将深入探讨这两个关键传感器在PCB布局中的I2C总线设计要点,以及如何…...

告别手动重启!用Python+PyAutoGUI写个游戏防崩溃守护脚本(附完整源码)

告别手动重启!用PythonPyAutoGUI打造游戏防崩溃守护脚本 深夜挂机刷副本时突然游戏崩溃,第二天醒来发现角色还在主城发呆?竞技场自动匹配因为断线重连失败而错过赛季奖励?这些问题对于MMO玩家和挂机游戏爱好者来说简直如同噩梦。本…...

硬件供电设计:解决模拟与数字电路噪声干扰的实战指南

1. 项目概述:从一次深夜宕机说起深夜两点,手机突然响起刺耳的告警铃声。一个关键的数据采集节点离线了。我睡眼惺忪地爬起来,远程登录,重启服务,一切如常。但半小时后,它又毫无征兆地“罢工”了。这种间歇性…...

Bee 蜂群效应智能体架构

第一章 绪论 1.1 研究背景与问题提出 在通用人工智能(AGI)发展的演进脉络中,传统单体大模型的“规模即智能”范式正面临算力瓶颈、泛化能力受限以及系统脆弱性等多重挑战。这种中心化架构在面对动态、开放的复杂环境时,其自适应与持续学习能力显得尤为不足。在此背景下,…...

别再只用默认配置了!GaussDB密码安全策略的这8个参数,DBA必须知道怎么调

GaussDB密码安全策略深度实战:8个关键参数配置指南 在数据库安全管理中,密码策略往往是最容易被忽视却又最常被攻击利用的薄弱环节。许多DBA习惯性地沿用数据库默认配置,殊不知这些默认值可能无法满足企业实际安全需求。GaussDB作为企业级分布…...

Midjourney年度订阅稀缺性验证:全球仅开放17.3%账户享受$99档位(基于2024年Q3后台错误码403-ENTITLEMENT统计)

更多请点击: https://codechina.net 第一章:Midjourney年度订阅稀缺性现象的实证发现 近期对Midjourney官方订阅渠道的持续监测(2023年10月–2024年3月)揭示了一种显著且可复现的市场行为模式:年度订阅选项在多数时段…...

终极指南:如何在Windows电脑上安装APK文件,告别臃肿安卓模拟器!

终极指南:如何在Windows电脑上安装APK文件,告别臃肿安卓模拟器! 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Wind…...

嵌入式Linux物联网设备安全加固实战:从零构建多层防御体系

1. 项目概述:从“能跑就行”到“固若金汤”的转变在物联网项目里,我见过太多这样的场景了:一个嵌入式Linux设备,功能跑通了,数据能上传了,大家就急着推向市场或者部署到现场。至于安全?往往是出…...