网站建设公司 知乎,怎么做内网网站,页面模板是需要原创功能才能有吗,怎么制作app软件赚钱目录 模拟算法介绍#xff1a;
#xff08;一、扫雷#xff09;
#xff08;二、灌溉#xff09;
#xff08;三、回文日期#xff09; 有一说一这题大佬的题解是真的强 模拟算法介绍#xff1a;
模拟算法通过模拟实际情况来解决问题#xff0c;一般容易理解但是实… 目录 模拟算法介绍
一、扫雷
二、灌溉
三、回文日期 有一说一这题大佬的题解是真的强 模拟算法介绍
模拟算法通过模拟实际情况来解决问题一般容易理解但是实现起来比较复杂有很多需要注意的细节或者是一些所谓很“麻模“的东西。
模拟题一般不涉及太难的算法一般就是由较多的简单但是不好处理的部分组成的考察选手的细心程度和整体思维逻辑。
一般为了使得模拟题写的逻辑清晰一些经常会写比较多的小函数来帮助解题例如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和ansmp用二维数组接收输入样例ans来确定是否是雷或确定雷的数量。遍历整个数组判断是否是雷if(mp[i][j] 1)如果是则ans9如果不是遍历周围周围八格是否有雷if(mp[_i])[_j] 1如果是则ans
#includebits/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 {//遍历周围八格是否有雷有雷则ansfor (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,1t 10,1k 100。 输出描述 输出一个整数表示答案。
输入输出示例
输入 3 6 2 2 2 3 4 1 输出 9 #includebits/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表示日期。 对于所有评测用例10000101N89991231保证 N 是一个合法日期的 8 位数表示。 输出描述 输出两行每行1个八位数。第一行表示下一个回文日期第二行表示下一个 ABABBABA 型的回文日期。
输入输出样例
输入
20200202
输出
20211202 21211212 有一说一这题大佬的题解是真的强 编写这么几个函数: 1、从int转换为指定位数的string的函数 2、从string转换为int的函数 3、判断闰年的函数 4、判断日期是否合法的函数 5、判断字符串是否是回文的函数 6、判断字符串是否是ABABBABA型回文的函数 #includebits/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;
}
今天就先到这了
看到这里了还不给博主扣个 ⛳️ 点赞☀️收藏 ⭐️ 关注
你们的点赞就是博主更新最大的动力 有问题可以评论或者私信呢秒回哦。