【算法通关指南:算法基础篇 】模拟算法专题:1. 铺地毯 2. 回文日期 3. 扫雷

【算法通关指南:算法基础篇 】模拟算法专题:1. 铺地毯 2. 回文日期 3. 扫雷
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人方向学习者
❄️个人专栏:《算法通关指南》
永远相信美好的事情即将发生
在这里插入图片描述

文章目录

前言

本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长

一、模拟算法

枚举顾名思义,就是把所有情况全都罗列出来,然后找出符合题目要求的那⼀个。因此,枚举是⼀种纯暴力的算法
⼀般情况下,枚举策略都是会超时的。此时要先根据题目的数据范围来判断暴力枚举是否可以通过。如果不行的话,就要用其他各种算法来进行优化(如:二分,双指针,前缀和与差分等)。
使用枚举策略 时,重点思考枚举的对象(枚举什么)枚举的顺序(正序还是逆序),以及枚举的方式(普通枚举?递归枚举?⼆进制枚举)

二、模拟的经典算法题

2.1 铺地毯

2.1.1题目

链接:铺地毯

在这里插入图片描述

2.1.2 算法原理

枚举所有的地毯,判断哪⼀个地毯能够覆盖(x, y)这个位置。
优化枚举方式
• 因为我们要的是最后⼀个能够覆盖(x, y)位置的地毯,那么逆序枚举所有的地毯,第⼀次找到覆
盖(x, y) 位置的就是结果;
• 如果从前往后枚举,我们至少要把所有地毯都枚举完,才能知道最终结果。

2.1.3代码

#include<iostream> using namespace std;typedeflonglong LL;constint N =1e5+10; LL a[N], b[N],g[N],k[N];int n;intfind(int x,int y){for(int i = n; i >=1; i--){// 判断是否覆盖 if(x >= a[i]&& y >= b[i]&& x <= a[i]+ g[i]&& y <= b[i]+ k[i])return i;}return-1;}intmain(){ cin >> n;for(int i =1; i <= n; i++) cin >> a[i]>> b[i]>> g[i]>> k[i]; LL x, y; cin >> x >> y; cout <<find(x, y)<< endl;return0;}

2.2 回文日期

2.2.1题目

链接:回文日期

在这里插入图片描述

2.2.2 算法原理

核心:每一个固定的年份有且只有一个月日组合可以与其构成回文关系,反之每一个固定的月日组合有且只有一个年份可以与其构成回文关系
两个枚举策略 :
策略一 :枚举所有日月的组合,然后根据回文的特性推出年份,然后比较这个数字时候在题目给定的区间内(复杂度最优10^3左右)
注意 :策略一在枚举2月时候因为0229反过来9220为闰年且合法故可以直接用打表的方式定为29天。
策略二 :枚举所有年的组合然后根据回文的特性推出月份和日,然后比较这个数字时候在题目给定的区间内(复杂度在10^4左右)
总结:解决问题时不同的枚举对象能大大优化问题的解决效率,这是我们在解决问题时要多多思考的.

2.2.3代码

2.2.3.1 枚举月 + 日

#include<iostream> using namespace std;int m[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};intmain(){int begin, end; cin >> begin >> end;int ret =0;for(int i =1; i <=12; i++){for(int j =1; j <= m[i]; j++){int k = j %10*1000+ j /10*100+ i %10*10+ i /10;int num = k *10000+ i *100+ j;if(num >= begin && num <= end) ret++;}} cout << ret << endl;return0;}

2.2.3.2 枚举年

#include<iostream> using namespace std;//判断是否为闰年 bool check_year(int y){if(y %4==0&& y %100!=0|| y %400==0)return true;elsereturn false;}intnum(int x){int k =0;while(x){ k = k *10+ x %10; x /=10;}return k;}intmain(){int begin, end; cin >> begin >> end;int x = begin /10000;int y = end /10000;int ret =0;for(int i = x; i <= y; i++){int k =num(i);int m = k /100;int d = k %100;int flag =0;//校验日期是否合法if(m >1|| m <=12){if(check_year(i)&& m ==2) flag =(d <=29);elseif((m ==1|| m ==3|| m ==5|| m ==7|| m ==8|| m ==10|| m ==12)&& d <=31) flag =(d <=31);elseif(m ==2) flag =(d <=28);elseif(m ==4|| m ==6|| m ==9|| m ==11) flag =(d <=30);if(flag){ k += i *10000;if(k >= begin && k <= end) ret++;}}} cout << ret << endl;return0;}

2.3 扫雷

2.3.1题目

链接:扫雷

在这里插入图片描述

2.3.2 算法原理

我们发现,当第⼀列中,第⼀行的格子的状态确定了之后,其实后续行的状态也跟着固定下来。而第⼀列中,第⼀行的状态要么有雷,要么没有雷,所以最终的答案就在0, 1, 2 中。因此,我们枚举第⼀列中,第一行的两种状态:要么有雷,要么没雷。然后依次计算剩下行的值,看看是否能满足所给的数据。
注意
(1)如何判断当前格子是否有雷
第二列的格子中:第i个格子决定了第一列第i,i - 1,i + 1个格子是否有雷,故定义两个数组a和b表示第一列和第二列,故可以推出关系式a[i] = b[i - 1] - a[i - 1] - a[i - 1]
(2)极端情况如下
|1 | 1 |
|0 | 3 |
如果我们只枚举到n当出现这种特例时看着好像正确,但却是错误的,故我们要枚举到n + 1,判段第n + 1个格子是否为0才能让整个逻辑闭环

2.3.3代码

#include<iostream> using namespace std;constint N =1e4+10;int a[N], b[N];intcheck1(int n){ a[1]=0;//第一格没有雷for(int i =2; i <= n +1; i++){ a[i]= b[i -1]- a[i -1]- a[i -2];if(a[i]<0|| a[i]>1)return0;}if(a[n +1])return0;return1;}intcheck2(int n){ a[1]=1;//第一格有雷for(int i =2; i <= n +1; i++){ a[i]= b[i -1]- a[i -1]- a[i -2];if(a[i]<0|| a[i]>1)return0;}if(a[n +1])return0;return1;}intmain(){int n; cin >> n;for(int i =1; i <= n; i++) cin >> b[i];int ret =0; ret +=check1(n); ret +=check2(n); cout << ret << endl;return0;}

总结与每日励志

✨本文介绍了模拟算法的基本概念及其应用,通过三个经典算法题(铺地毯、回文日期、扫雷)展示了模拟算法的解题思路与优化方法。文章强调枚举策略的选择对解题效率的影响,并提供了详细代码实现。最后以励志话语"永远相信美好的事情即将发生"作结,鼓励读者坚持学习与成长。

在这里插入图片描述

Read more

为省5-10美元差点毁库!Claude一条指令删光200万条数据、网站停摆24小时,创始人坦言:全是我的错

为省5-10美元差点毁库!Claude一条指令删光200万条数据、网站停摆24小时,创始人坦言:全是我的错

编译 | 屠敏 出品 | ZEEKLOG(ID:ZEEKLOGnews) AI 时代,一次看似普通的操作,竟能让整套生产环境与近 200 万条数据瞬间「归零」。 近日,数据科学社区 DataTalks.Club 创始人 Alexey Grigorev 就遭遇了这样的惊魂时刻,他在使用 AI 编程工具 Claude Code 管理网站服务器时,意外清空了平台积累 2.5 年的核心数据,甚至连数据库快照也未能幸免,导致网站停摆整整 24 小时。 这起事故不仅在开发者社区引发热议,更给所有依赖 AI 工具与自动化运维的从业者敲响了警钟。事后,Alexey Grigorev 公开复盘了整个过程,并揭露了此次事故的核心问题。让我们一起看看。 一次看似很普通的网站迁移 这场“删库”事件的前因,其实并不复杂。

By Ne0inhk
星标超 28 万,OpenClaw 两天两次大更!适配GPT 5.4,告别“抽卡式 Prompt”

星标超 28 万,OpenClaw 两天两次大更!适配GPT 5.4,告别“抽卡式 Prompt”

整理 | 梦依丹 出品 | ZEEKLOG(ID:ZEEKLOGnews) “We don’t do small releases.” 这是 OpenClaw 在发布 2026.3.7 版本时写下的一句话。 刚刚过去的周六与周日,这个 GitHub 星标已超 28 万 的 AI Agent 开源项目再次迎来两轮重量级更新。 两天两次更新:OpenClaw 做了一次“真正的大版本升级” 打开 OpenClaw 的 GitHub 更新日志,你会发现这次版本更新的规模确实不小。在 3 月 7 日发布更新后,第二天又迅速推出 2026.3.8-beta.1 和

By Ne0inhk
苹果最贵手机要来了!折叠屏iPhone将于9月亮相;部分高校严禁校内使用OpenClaw;黄仁勋预言:传统软件和APP或将消失 | 极客头条

苹果最贵手机要来了!折叠屏iPhone将于9月亮相;部分高校严禁校内使用OpenClaw;黄仁勋预言:传统软件和APP或将消失 | 极客头条

「极客头条」—— 技术人员的新闻圈! ZEEKLOG 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。(投稿或寻求报道:[email protected]) 整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 一分钟速览新闻点! * 多所高校要求警惕 OpenClaw 安全风险,部分严禁校内使用 * 荣耀 CEO 李健:荣耀机器人全栈自研,将聚焦消费市场 * 马化腾凌晨 2 点发声:还有一批龙虾系产品陆续赶来 * 前快手语言大模型中心负责人张富峥,已加入智源人工智能研究院,负责 LLM 方向 * 最新全球 AI 应用百强榜发布,豆包/DeepSeek/千问上榜 * 苹果折叠 iPhone 将于九月亮相,融合 iPhone 与 iPad 体验

By Ne0inhk
不止“996”!曝硅谷AI创业圈「极限工作制」:每天16小时、凌晨3点下班、周末也在写代码

不止“996”!曝硅谷AI创业圈「极限工作制」:每天16小时、凌晨3点下班、周末也在写代码

编译 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) “如果你周日去旧金山的咖啡馆,会发现几乎每个人都在工作。” 这是 AI 创业公司 Mythril 联合创始人 Sanju Lokuhitige 最近最直观的感受。去年 11 月,他特地搬到旧金山,只为了更接近 AI 创业浪潮的中心。但很快,他也被卷入了这股浪潮带来的另一面——一种越来越极端的工作文化。 Lokuhitige 坦言,他现在几乎每天工作 12 小时,每周 7 天。除了每周少数几场刻意安排的社交活动(主要是为了和创业者们建立联系),其余时间几乎都在写代码、做产品。 “有时候我整整一天都在编程,”他说,“我基本没有什么工作与生活的平衡。”而这样的生活,在如今的 AI 创业圈里并不算罕见。 旧金山 AI 创业圈的真实日常 一位在旧金山一家 AI

By Ne0inhk