模拟算法题练习(一)(扫雷,灌溉,回文日期)

 目录

模拟算法介绍:

(一、扫雷)

(二、灌溉)

(三、回文日期)

有一说一这题大佬的题解是真的强


模拟算法介绍:

模拟算法通过模拟实际情况来解决问题,一般容易理解但是实现起来比较复杂,有很多需要注意的细节,或者是一些所谓很“麻模“的东西。

模拟题一般不涉及太难的算法,一般就是由较多的简单但是不好处理的部分组成的,考察选手的细心程度和整体思维逻辑。

一般为了使得模拟题写的逻辑清晰一些,经常会写比较多的小函数来帮助解题,例如int和string的相互转换、回文串的判断日期的转换、各种特殊条件的判断等等。

(一、扫雷)

用户登录

题目描述
在一个 n 行 m 列的方格图上有一些位置有地雷,另外一些位置为空。请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷
输入描述
输入的第一行包含两个整数 n,m。
第 2 行到第 n +1行每行包含 m 个整数,相邻整数之间用一个空格分隔。如果对应的整数为 0,表示这一格没有地雷。如果对应的整数为 1,表示这格有地雷。
其中,1 <= n,m <= 100 分钟后还是在当天
输出描述
输出 n 行,每行 m 个整数,相邻整数之间用空格分隔。
对于没有地雷的方格,输出这格周围的地雷数量。对于有地雷的方格,输出9。

输入输出样例

输入

3 4

0 1 0 0

1 0 1 0

0 0 1 0

输出

2 9 2 1

9 4 9 2

1 3 9 2

思路:

首先开辟两个二维数组mp和ans,mp用二维数组接收输入样例,ans来确定是否是雷或确定雷的数量。遍历整个数组,判断是否是雷(if(mp[i][j] == 1)),如果是,则ans=9;如果不是,遍历周围周围八格是否有雷(if(mp[_i])[_j] == 1),如果是则ans++;

#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int mp[N][N], ans[N][N];int main()
{int n, m; cin >> n >> m;// 输入 n, m,  n行m列for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> mp[i][j];// 输入地雷}}for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (mp[i][j] == 1)// 如果有雷, 则给 ans 赋值为 9{ans[i][j] = 9;}else {//遍历周围八格是否有雷,有雷则ans++for (int _i = max(1, i - 1); _i <= min(n, i + 1); ++_i){for (int _j = max(1, j - 1); _j <= min(m, j + 1); ++_j){if (mp[_i][_j]) ans[i][j]++;}}}}}for (int i = 1; i <= n; ++i){for (int j = 1; j <= m; ++j){cout << ans[i][j] << ' ';}cout << '\n';}return 0;
}

(二、灌溉)

用户登录

题目描述
小蓝负责花园的灌溉工作。
花园可以看成一个n 行 m 列的方格图形。中间有一部分位置上安装有出水管。
小蓝可以控制一个按钮同时打开所有的出水管,打开时,有出水管的位置可以被认为已经灌溉好。
每经过一分钟,水就会向四面扩展一个方格,被扩展到的方格可以被认为已经灌溉好。即如果前一分钟某一个方格被灌溉好,则下一分钟它上下左右的四个方格也被灌溉好。
给定花园水管的位置,请问 k分钟后,有多少个方格被灌溉好?
输入描述
输入的第一行包含两个整数 n,m。
第二行包含一个整数 t,表示出水管的数量。
接下来t行描述出水管的位置,其中第之行包含两个数 r,c表示第,行第 c列有一个排水管。
接下来一行包含一个整数 k。
其中,1<= n,m<= 100,1<=t<= 10,1<=k<= 100。
输出描述
输出一个整数,表示答案。

输入输出示例

输入:

3 6 2 2 2 3 4 1

输出:

9

#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int a[N][N], b[N][N];int main()
{int n, m; cin >> n >> m;//输入 n, m 表示 n 行 m 列int t; cin >> t;// 输入 t, 表示出水管的数量while (t--){int x, y; cin >> x >> y;// 输入 x, y表示排水管的坐标a[x][y] = 1;}int k; cin >> k;// 输入 k, 表示 k 分钟while (k--){for (int i = 1; i <= n; ++i){for (int j = 1; j <= m; ++j){if (a[i][j]){if (a[i][j])b[i][j] = b[i - 1][j] = b[i + 1][j] = b[i][j - 1] = b[i][j + 1] = 1;// 如果 a[i][j] 是雷, 则四周都赋值为 1}}}}//将b复制回afor (int i = 1; i <= n; ++i){for (int j = 1; j <= m; ++j){a[i][j] = b[i][j];}}int count;// 统计 k 分钟后, 有count个方格被灌溉for (int i = 1; i <= n; ++i){for (int j = 1; j <= m; ++j){if (a[i][j] == 1)count++;}}cout << count;return 0;
}

(三、回文日期)

用户登录

题目描述
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为如果将这个日期按“yyyymmdd”的格式写成一个8位数是20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是“千年一遇”的特殊日子。对此小明很不认同,因为不到2年之后就是下一个回文日期:20211202即2021年12月2日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA型的回文日期。对此小明也不认同,因为大约 100年后就能遇到下一个ABABBABA型的回文日期:21211212即2121年12月12日。算不上“千年一遇”, 顶多算“千年两遇”。
给定一个8位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA型的回文日期各是哪一天。
输入描述
输入包含一个八位整数 N,表示日期。
对于所有评测用例,10000101<N<89991231,保证 N 是一个合法日期的 8 位数表示。
输出描述
输出两行,每行1个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。

输入输出样例:

输入:

20200202

输出

20211202 21211212

有一说一这题大佬的题解是真的强

编写这么几个函数:

1、从int转换为指定位数的string的函数

2、从string转换为int的函数

3、判断闰年的函数

4、判断日期是否合法的函数
5、判断字符串是否是回文的函数

6、判断字符串是否是ABABBABA型回文的函数

#include<bits/stdc++.h>
using namespace std;// 将字符串转换为数字
int s2i(string s)
{int res = 0;for (const auto& i : s)res = res * 10 + i - '0';// 通过字符与'0'的差值来得到对应的数字,并累加到结果中 return res;
}// 将整数转换为指定宽度的字符串 
string i2s(int x, int w)
//  要被转换的整数, 转换的位数
{string res;while (x)res += (x % 10) + '0', x /= 10;// 取x的个位数,并转换为字符,添加到结果字符串中,然后x除以10 while (res.length() < w)res += '0';// 当结果字符串的长度小于指定的位数时,循环执行reverse(res.begin(), res.end());return res;}// 判断是否为闰年  
bool isLeapYear(int year)
{return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}// 判断日期是否合法
bool isok(int year, int month, int day)
{int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };if (isLeapYear(year))days[2] = 29;//闰年2月29天return day <= days[month];
}// 判断是否为回文
bool isPa(string s)
{for (int i = 0; i < s.length() / 2; ++i){if (s[i] != s[s.length() - 1 - i])return false;如果前后字符不相等,则不是回文  }return true;
}//判断是否是ABBA型回文
bool isPa2(string s)
{if (isPa(s))return false;return s[0] == s[2] && s[1] == s[3];
}int main()
{string s; cin >> s;// 输入 s, 表示日期int year = s2i(s.substr(0, 4)), month = s2i(s.substr(4, 2)), day = s2i(s.substr(6, 2));// 分割字符串为对应的年, 月, 日bool ans1 = false, ans2 = false;// 定义两个标志变量,用于标记是否找到了回文和ABBA型日期  for (int i = year; i <= 9999; ++i)//遍历年份{for (int j = 1; j <= 12; ++j)//遍历月份{if (i == year && j < month)continue;// 如果是是当前年份且月份小于输入的月份,则跳过  for (int k = 1; k <= 31; ++k)//遍历天数{if (i == year && j == month && k <= day)continue;// 如果是当前年份且是当前月份且日小于等于输入的日,则跳过 if (!isok(i, j, k))continue;// 如果不合法,则跳过string date = i2s(i, 4) + i2s(j, 2) + i2s(k, 2);// 如果还没有找到回文日期且当前日期是回文,则输出并标记已找到if (!ans1 && isPa(date)){cout << date << '\n';ans1 = true;}// 如果还没有找到ABBA型日期且当前日期是ABBA型,则输出并标记已找到if (!ans2 && isPa2(date)){cout << date << '\n';ans2 = true;}}}}return 0;
}

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/509443.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows上构建一个和Linux类似的Terminal

感谢大佬批评指正&#xff0c;现已更新 preview Target&#xff1a;致力打造最赏心悦目Window下的终端&#xff0c;同时能够很接近Linux的使用习惯 key word&#xff1a;windows终端美化 windows terminal windows powershell 类似Linux下的Window终端 Window也能用ll windows…

Linux编程3.1 进程-进程的概念

前情提及&#xff1a; 程序和进程内核中的进程结构C程序启动过程进程终止方式非局部跳转进程资源限制进程创建、执行和终止进程类型进程状态进程组 进程的概念 进程&#xff1a;程序运行&#xff0c;由操作系统内核对该程序进行资源的分配 &#xff0c; 进程中&#xff0c;再…

牛客练习赛122

D:圆 正着求删除的最小代价不好做&#xff0c;采用逆向思维&#xff0c;求选择一些不相交的线段使得构成一个圆的代价尽量大&#xff0c;最后答案就是所有线段权值之和减去最大代价。 那么如何求这个最大代价呢&#xff1f;显然区间DP 老套路&#xff1a;破环成链&#xff0…

【学习心得】网站运行时间轴(爬虫逆向)

一、网站运行时间轴 掌握网站运行时间轴&#xff0c;有助于我们对“请求参数加密”和“响应数据加密”这两种反爬手段的深入理解。 二、从网站运行的时间轴角度来理解两种反爬手段 1、加载HTML&#xff1a; 这是浏览器访问网站时的第一步&#xff0c;服务器会返回基础…

2024|CISP认证详细报考流程和条件

证书介绍 CISP&#xff08;Certified Information Security Professional&#xff0c;注册信息安全专业人员&#xff09;证书是由中国信息安全测评中心&#xff08;CNITSEC&#xff09;颁发的专业资质证书&#xff0c;旨在为信息安全领域培养和认证具备一定专业水平的安全人才…

5.测试教程 - 进阶篇

文章目录 1.按测试对像划分1.1**界面测试**1.2**可靠性测试**1.3**容错性测试**1.4**文档测试**1.5**兼容性测试**1.6**易用性测试**1.7**安装卸载测试**1.8**安全测试**1.9**性能测试**1.10**内存泄漏测试** 2.按是否查看代码划分2.1黑盒测试(Black-box Testing)2.2白盒测试(W…

框架漏洞-->Struts2 Docker_Vulnhub搭建

来浅浅的讲一下Struts2漏洞 目录 1.Docker_Vulnhub搭建 2.Struts2 3.Struts2的框架特征 4.S2-029-->Remote Code Execution 5.漏洞复现 1.RCE 2.Getshell 1.Docker_Vulnhub搭建 因为我用的是Linux&#xff0c;所以我选择直接搭个docker&#xff0c;这里我建议先换个…

绝对定位的一些特性;CSS绝对定位absolute

想要实现如下效果&#xff1a; yellow区域是宽度是100%&#xff1b;想要一个按钮在右侧&#xff0c;且和蓝色区域右侧对齐 思考 毋庸置疑&#xff0c;按钮肯定得使用绝对定位&#xff0c;但是绝对定位的定位位置肯定不能写死&#xff0c;因为这个是个公共组件&#xff0c;黄色…

WPF TabControl 滚动选项卡

文章目录 前言相关链接TabControl是什么东西通过模板副本查看样式IsItemsHost如何修改HandyControl的TabControl 滚动 总结 前言 我原本以为是很简单的事情&#xff0c;但是没想到实际做起来还是有很多的基础知识点的。 相关链接 WPF 控件库——可拖动选项卡的TabControl Tab…

鸿蒙App开发新思路:小程序转App

国家与国家之间错综复杂&#xff0c;在谷歌的安卓操作系统“断供”后&#xff0c;鸿蒙系统的市场化&独立化的道路便显而易见了。 2024年1月18日&#xff0c;华为宣布&#xff0c;不再兼容安卓的“纯血鸿蒙”--HarmonyOS NEXT鸿蒙星河版最终面世&#xff0c;并与2024年Q4正…

CPython:比较运算符串联的差异

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 在C语言和Python中&#xff0c;比较运算符是一个常用的运算符&#xff0c;但这两种语言在某些情况下对比较运算符的解析缺存在差异&#xff0c;本文旨在明确这一点。 P…

正则表达式应用

应用一&#xff1a;去掉特殊的行&#xff0c;保留想要的行 文档中包含如下内容&#xff1a; 去掉特殊的行&#xff0c;只保留图像名的行。"0.\d{1,2}" ^\s*$\r\n去除后结果 去除没有内容的行 去除结果 总结