模拟算法题练习(一)

news2024/11/18 15:37:32

模拟算法介绍:

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

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

一般为了使得模拟题写的逻辑清晰一些,经常会写比较多的小函数来帮助解题,例如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;
  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[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;
    int t; cin >> t;
    while (t--)
    {
        int x, y; cin >> x >> y;
        a[x][y] = 1;
    }
    int k; cin >> 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;
                }
            }
        }
    }
    //将b复制回a
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= m; ++j)
        {
            a[i][j] = b[i][j];
        }
    }
    int 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;
	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.coloradmin.cn/o/1479010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OD(12)之Mermaid思维导图(Mindmap)

OD(12)之Mermaid思维导图(Mindmap)使用详解 Author: Once Day Date: 2024年2月29日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermaid使用指南_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting tool…

JVM运行流程

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; JVM 1. 运行流程2. 运行时数据区2.1 堆&am…

鸿蒙Harmony应用开发—ArkTS声明式开发(焦点事件)

焦点事件指页面焦点在可获焦组件间移动时触发的事件&#xff0c;组件可使用焦点事件来处理相关逻辑。 说明&#xff1a; 从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 目前仅支持通过外接键盘的tab键、方向键触发。不支…

BEANZ NFT 概览与数据分析

作者&#xff1a;stellafootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;BEANZ NFT Collection Dashboard 2022 年 3 月 31 日&#xff0c;BEANZ NFT 的出现给 Azuki NFT 持有者带来了惊喜&#xff0c;成为 Azuki NFT 的亲密伙伴。这个 NFT …

生成式AI设计模式:综合指南

原文地址&#xff1a;Generative AI Design Patterns: A Comprehensive Guide 使用大型语言模型 (LLM) 的参考架构模式和心理模型 2024 年 2 月 14 日 对人工智能模式的需求 我们在构建新事物时&#xff0c;都会依赖一些经过验证的方法、途径和模式。对于软件工程师来说&am…

Linux设备模型(七) - Netlink

一&#xff0c;什么是netlink通信机制 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。Netlink 是一种特殊的 socket&#xff0c;它是 Linux 所特有的。 Netlink 是一种在内核与用户应用间进行双向数…

助力智能化农田作物除草,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建农田作物场景下玉米苗、杂草检测识别分析系统

在我们前面的系列博文中&#xff0c;关于田间作物场景下的作物、杂草检测已经有过相关的开发实践了&#xff0c;结合智能化的设备可以实现只能除草等操作&#xff0c;玉米作物场景下的杂草检测我们则少有涉及&#xff0c;这里本文的主要目的就是想要基于YOLOv7系列的模型来开发…

论文阅读:基于超像素的图卷积语义分割(图结构数据)

#Superpixel-based Graph Convolutional Network for Semantic Segmentation github链接 引言 GNN模型根据节点特征周围的边来训练节点特征&#xff0c;并获得最终的节点嵌入。通过利用具有不同滤波核的二维卷积对来自附近节点的信息进行整合&#xff0c;给定超像素方法生成的…

【RK3568】

RK3568 一、配置IP地址二、开发板连接网络&#xff0c;电脑连接无线&#xff0c;都正常上网三、GCC四、CMake1. CMakeLists.txt2. main.cpp3.build 五、传输文件 一、配置IP地址 vi /etc/init.d/S99z_ip //权限chmod ax S99z_ip /***********************************/ case &q…

瑞吉苍穹外卖如何拓展?已经经过不同公司多轮面试。项目中会问到哪些问题?以及问题如何解决?

别催了&#xff0c;别催了&#xff0c;先收藏吧。 作者大大正在加班加点完成。 文章会尽快发布&#xff0c;关注收藏&#xff0c;尽请期待。 想要加入并查阅作者的知识库可以联系作者 不要白嫖&#xff0c;通过后&#xff0c;附上关注和收藏截图。 已有众多小伙伴加入 目前…

Python中的os库

一.OS库简介 OS是Operating System的简写&#xff0c;即操作系统。 OS库是一个操作系统接口模块&#xff0c;提供一些方便使用操作系统相关功能的函数。 二.OS库常用函数 2.1文件和目录 2.1.1&#xff1a;os.getcwd() 作用&#xff1a;返回当前工作目录&#xff0c;结果是…

WebCPM:首个开源的交互式网页搜索中文问答模型

论文题目&#xff1a;WEBCPM: Interactive Web Search for Chinese Long-form Question Answering   论文日期&#xff1a;2023/05/23(ACL 2023)   论文地址&#xff1a;https://arxiv.org/abs/2305.06849   GitHub地址&#xff1a;https://arxiv.org/abs/2305.06849 文章…

【前端素材】推荐优质后台管理系统cassie平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理网站、应用程序或系统的管理界面&#xff0c;通常由管理员和工作人员使用。它提供了访问和控制网站或应用程序后台功能的工具和界面&#xff0c;使其能够管理用户、内容、数据和其他各种功能。 2、功能需求 后台管理系…

nginx使用详解--动静分离

什么是动静分离&#xff1f; 为了提高网站的响应速度&#xff0c;减轻程序服务器&#xff08;Tomcat&#xff0c;Jboss等&#xff09;的负载&#xff0c;对于静态资源&#xff0c;如图片、js、css等文件&#xff0c;可以在反向代理服务器中进行缓存&#xff0c;这样浏览器在请…

亿道信息发布两款升级款全加固笔记本电脑

2022年5月19日&#xff0c;加固手持终端。加固平板电脑、加固笔记本电脑专业设计商和制造商&#xff0c;以及加固型移动计算机软硬件整体定制解决方案提供商亿道信息&#xff0c;宣布对其两款广受欢迎的加固笔记本电脑产品EM-X14U和EM-X15U进行重大升级。新发布的两款升级款全加…

C语言:自定义类型 - 结构体 联合体 枚举

C语言&#xff1a;自定义类型 - 结构体 & 联合体 & 枚举 结构体结构体声明结构体创建匿名结构体初始化 结构体的重命名结构体访问内存对齐位段 联合体枚举 在C语言中&#xff0c;自定义类型是指程序员可以通过一系列的定义和说明来创建的新的数据类型。这些自定义类型可…

NPN型三极管与PNP型三极管基本原理

NPN型三极管与PNP型三极管基本原理 文章目录 NPN型三极管与PNP型三极管基本原理一、三极管二、结构三、工作原理四、基本应用五、总计 一、三极管 三极管是电子电路中最基本、最常见、重要的器件&#xff0c;其主要功能是对电流的放大和开关作用&#xff0c;从半导体结构上可以…

PostgreSQL从入门到精通教程 - 第45讲:poc-tpcc测试

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第45讲&#…

共同应对共享挑战:2023 Open Source Congress 报告(中文版)

开源社受邀参加了 2023 年 7 月底在瑞士日内瓦举办的 2023 Open Source Congress&#xff0c;并发布了一篇会议速览&#xff1b;之后 LFAPAC 发布了会议总结报告&#xff08;英文版&#xff09;&#xff0c;开源社国际接轨工作组的翻译志愿者们群策群力地翻译了该总结报告。 【…

10-Linux部署ElasticSearch

Linux部署ElasticSearch 简介 全文搜索属于最常见的需求&#xff0c;开源的 Elasticsearch &#xff08;以下简称 es&#xff09;是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。 Elasticsearch简称es&…