C++知识点总结(22):模拟算法真题 ★★★★☆《卡牌游戏》《移动距离》

一、卡牌游戏

1. 审题

题目描述

A , B , C A,B,C A,B,C 三人在玩一个卡牌游戏,规则如下:
游戏开始时, 3 3 3 人分别会得到若干张手牌, 每张牌上写着 'a''b''c' 中某一个字母。手牌的顺序严格按照输入顺序排列,不允许改变顺序。
游戏从 A A A 开始出牌。如果轮到某人的回合,且这个人手上有牌,他必须出自己手上的第 1 1 1 张牌,之后轮到这张牌的写着的字母同名的人出牌(例如出 'a' 牌之后就轮到 A A A 的回合)。
如果轮到某人的回合,且这个人手没有牌,这个人就是赢家。
三人的起始手牌以字符串 S A S_A SA S B S_B SB S C S_C SC ​的形式给出,字符串开头是第1张牌。

输入描述

三行,分别是字符串 S A S_A SA S B S_B SB S C S_C SC ​。

输出描述

输出胜出者

样例1

输入

aca
accc
ca

输出

A

样例2

输入

abcb
aacc
bbcc

输出

C

提示

所有字符长度 < 100 <100 <100

2. 思路

2.1 暴力模拟

首先,我们应该想到的是用数组或者 string 存储每个人手上的牌。为了更方便,我们用 string 存储。

然后,我们就要开始模拟游戏的过程了。我们可以分析一下样例 1 1 1 的游戏过程:

  • A A A 出牌 'a',之后轮到 A A A
  • A A A 出牌 'c',之后轮到 C C C
  • C C C 出牌 'c',之后轮到 C C C
  • C C C 出牌 'a',之后轮到 A A A
  • A A A 出牌 'a',之后轮到 A A A

此时 A A A 手上已经没有牌了, A A A 是赢家。

最后,我们写出初始的代码。

2.2 技巧模拟

暴力模拟得到 T L E TLE TLE 的结果,我们尝试换一种思路作答。

我们要定义六个变量,分别是三个人手上的牌和三个人出牌的下标。

每次出牌的时候,将出牌的下标都 + 1 +1 +1,表示应该出哪一张牌,这样下一次出牌可以直接写 ?[l?]

3. 参考答案

3.1 初试

#include <iostream>
#include <string>
using namespace std;string card[5];
char now;
int player;int main()
{// 输入每个人手上的牌cin >> card[1] >> card[2] >> card[3];// 模拟打牌while (card[1] != "" && card[2] != "" && card[3] != ""){if (now == 'a'){player = 1;}if (now == 'b'){player = 2;}if (now == 'c'){player = 3;}card[player].erase(0, 1);now = card[player][0];}// 输出最后一个玩家cout << toupper(now);return 0;
}

结果: T L E TLE TLE C P U − T i m e − L i m i t − E x c e e d e d CPU-Time-Limit-Exceeded CPUTimeLimitExceeded

3.2 死循环思路

#include <iostream>
#include <string>
using namespace std;string a, b, c;
int la = -1, lb = -1, lc = -1;int main()
{// 输入每个人手上的牌cin >> a >> b >> c;// 模拟打牌la++;char card = c[la];while (true){if (card == 'a'){if (la + 1 == a.length()) // A没有牌了{cout << "A";break;}la++;card = a[la];}else if (card == 'b'){if (lb + 1 == b.length()) // B没有牌了{cout << "B";break;}lb++;card = b[lb];}else{if (lc + 1 == c.length()) // C没有牌了{cout << "C";break;}lc++;card = c[lc];}}return 0;
}

结果:

AC: 90%
WA: 10%

错误样例:

输入期待输出你的输出
aca accc caAC

二、移动距离

题目描述

X X X 星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为 1 , 2 , 3 , ⋯ 1,2,3,⋯ 1,2,3,。当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:

1  2  3  4  5  6
12 11 10 9  8  7
13 14 15 .....

我们的问题是:已知了两个楼号 m m m n n n,需要求出它们之间的最短移动距离。(不能斜线方向移动)

输入描述

输入为 3 3 3 个整数 w , m , n w,m,n w,m,n,空格分开,都在 1 1 1 1 0 4 10^4 104 范围内。 w w w 为排号宽度 m , n m,n m,n 为待计算的楼号。

输出描述

要求输出一个整数,表示 m m m n n n 两楼间最短移动距离。

样例1

输入

6 8 2

输出

4

二、思路

123456
1123456
2121110987
3131415161718
4242322212019

w = 6 w=6 w=6 m − n m-n mn的最短移动距离,在数学中也就是求 m m m n n n 的曼哈顿距离。

也就是说,我们要将 m m m x 1 x_1 x1 y 1 y_1 y1 求出,并将 n n n x 2 x_2 x2 y 2 y_2 y2 求出,再做一次运算:

a n s = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ ans=|x_1-x_2|+|y_1-y_2| ans=x1x2+y1y2

求行方法:

if (m % w == 0)
{x = m / w;
}
else
{x = m / w + 1;
}

求列方法:

if (x % 2 == 0) // 偶数行 右→左排列
{if (m % w == 0){y = 1;}else{y = w - m % w + 1;}
}
else // 奇数行 左→右排列
{if (m % w == 0){y = w;}else{y = m % w;}
}

3. 参考答案

#include <iostream>
#include <cmath>
using namespace std;int findx(int w, int m)
{int x;if (m % w == 0){x = m / w;}else{x = m / w + 1;}return x;
}int findy(int w, int m, int x)
{int y;if (x % 2 == 0){if (m % w == 0){y = 1;}else{y = w - m % w + 1;}}else{if (m % w == 0){y = w;}else{y = m % w;}}return y;
}int main()
{int w, m, n;int x1, y1, x2, y2;cin >> w >> m >> n;x1 = findx(w, m);x2 = findx(w, n);y1 = findy(w, m, x1);y2 = findy(w, n, x2);cout << abs(x1-x2) + abs(y1-y2);return 0;
}

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

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

相关文章

前端【技术类】资源学习网站整理(那些年的小网站)

学习网站整理 值得分享的视频博主&#xff1a;学习网站链接 百度首页的资源收藏里的截图&#xff08;排列顺序没有任何意义&#xff0c;随性而已~&#xff09;&#xff0c;可根据我标注的关键词百度搜索到这些网站呀&#xff0c;本篇末尾会一一列出来&#xff0c;供大家学习呀 …

彻底搞懂回溯算法(例题详解)

目录 什么是回溯算法&#xff1a; 子集问题&#xff1a; 子集问题II(元素可重复但不可复选): 组合问题&#xff1a; 组合问题II(元素可重复但不可复选): 排列问题&#xff1a; 排列问题II(元素可重复但不可复选): 什么是回溯算法&#xff1a; 「回溯是递归的副产品&…

最小生成树---Kruskal算法

最小生成树定义&#xff1a; 给定一张边带权的无向图 G(V,E)&#xff0c;其中 V 表示图中点的集合&#xff0c;E 表示图中边的集合。 由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树&#xff0c;其中边的权值之和最小的生成树被称为无向图 G…

leetcode hot100 每日温度

在本题中&#xff0c;我们是通过单调栈来解决的&#xff0c;因为我们采用了栈的数据结构&#xff0c;并且&#xff0c;栈内存储的元素是单调的。 本题我们考虑&#xff0c;将气温数组元素的下标存入栈中&#xff0c;首先初始化要把0放入&#xff0c;0是下标的意思。然后我们拿…

华为HCIP Datacom H12-821 卷4

1.单选题 下面哪些策略或工具不能够应用于 OSPF: A、access-list B、prefix-list C、route- Policy D、as-path filter 正确答案&#xff1a; D 解析&#xff1a; as-path-filter命令用来创建AS路径过滤器&#xff0c;OSPF属于IGP协议&#xff0c;不涉及到AS号。 2.单选题…

【python基础学习05课_for循环以及双重for循环】

FOR循环 一、认识循环-while 1、循环条件不能超出列表长度 当i 1&#xff0c;while i < len(lst1) 时&#xff0c;i 3后, 打印print&#xff08;lst[3]&#xff09;小宋老师&#xff0c; 继续1, i 4, 4不小于 len(lst1)&#xff0c;打破循环。 2、循环条件超出列表长度报错…

JMeter元件和采样器一览

Apache JMeter是一个强大的开源负载测试工具&#xff0c;用于性能和功能测试。JMeter提供了丰富的元件和采样器&#xff0c;使得它能够模拟复杂的测试场景和高并发的用户请求。以下是JMeter中常用的一些元件和采样器的介绍和讲解&#xff1a; 测试计划元件 测试计划&#xff0…

latex报错I was expecting a `,‘ or a `}‘的解决办法

解决办法——经过检查在ref22后面缺少一个逗号 总结 当你在使用LaTeX时遇到“I was expecting a , or a }”这样的错误&#xff0c;这通常意味着LaTeX在解析你的代码时&#xff0c;预期在某个位置看到一个逗号&#xff08;,&#xff09;或一个大括号&#xff08;}&#xff09;…

每日一题 2369

2369. 检查数组是否存在有效划分 题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums &#xff0c;你必须将数组划分为一个或多个 连续 子数组。 如果获得的这些子数组中每个都能满足下述条件 之一 &#xff0c;则可以称其为数组的一种 有效 划分&#xff1a; 子数…

PTA 1010 一元多项式求导

1010 一元多项式求导 (25分) C/C - 知乎 (zhihu.com) #include<stdio.h> int main(){ int x,n; scanf("%d %d",&x,&n); if(n0)printf("%d %d",0,0); //n0 说明是常数&#xff0c;不需要求导 else printf("%d %…

STM32 串口通信

串口发原理 在stm32每个串口内部有发送寄存器和发送移位寄存器。 当调用HAL_UART_Transmit 时&#xff0c;cpu会将发送的数据放入发送寄存器中。发送移位寄存器会将数据转换成电平的高低&#xff0c;从TX发出。 1、轮询模式配置、发送与接收 轮询模式时cpu会不断检测发送数…

嵌入式中汇编语言的基本实现

大家好&#xff0c;今天给大家分享&#xff0c;GNU汇编的语法。 第一&#xff1a;汇编简介 GNU 汇编语法适用于所有的架构&#xff0c;并不是 ARM 独享的&#xff0c;GNU 汇编由一系列的语句组成&#xff0c; 每行一条语句&#xff0c;每条语句有三个可选部分&#xff0c;如下…

小白学视觉 | 详解遗传算法 GA(Python实现代码)

本文来源公众号“小白学视觉”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;详解遗传算法 GA&#xff08;Python实现代码&#xff09; 转自&#xff1a;机器之心 英文&#xff1a;www.analyticsvidhya.com/blog/2017/07/introduc…

在线上传解压PHP文件代码,压缩/压缩(网站一键打包)支持密码登录

在线上传解压PHP文件代码&#xff0c;压缩/压缩(网站一键打包)支持密码登录 资源宝分享&#xff1a;www.httple.net 如果你没有主机控制面板这个是最好选择&#xff0c;不需要数据库&#xff0c;上传当控制面板使用&#xff0c;无需安装任何扩展&#xff0c;安全高&#xff0c;…

重拾前端基础知识:CSS

重拾前端基础知识&#xff1a;CSS 前言选择器简单选择器属性选择器组合选择器 插入CSS内嵌样式&#xff08;Inline Style&#xff09;内部样式&#xff08;Internal Style&#xff09;外部样式&#xff08;External Style&#xff09; 层叠颜色背景颜色文本颜色RGB 颜色HEX 颜色…

ESD管 uClamp3331ZA、AZ5A83-01B 、AZ8523-01B国产替代ESD0321CW

上海雷卯ESD二极管 ESD0321CW替代国外品牌型号uClamp3331ZA、AZ5A83-01B 、AZ8523-01B&#xff0c;参数对比如下&#xff1a; 判断ESD二极管是否可以替代需注意的几点&#xff1a; 1. VRWM 是否接近 2. 抗静电能力是否接近&#xff1b; 3. VBR 是否接近&#xff1b; 4. IPP…

【小程序】首屏渲染优化

小程序首屏渲染优化对于提升用户体验以及减少用户等待时间非常重要。下面我们来详细解析小程序首屏渲染优化的相关技巧和方法&#xff0c;并结合代码示例进行分析。 首先&#xff0c;我们需要了解小程序的渲染流程。小程序的渲染过程可以分为两个阶段&#xff1a;解析阶段和布局…

Julia语言中的位运算符、赋值运算符、算术运算符

算术运算符 # 使用基本的赋值运算符 a 10 println("a 的初始值是: $a") # 使用加法赋值运算符 a 5 println("a 加上 5 后的值是: $a") # 使用减法赋值运算符 - a - 3 println("a 减去 3 后的值是: $a") # 使用乘法赋值运算符…

Mistral发布语言大模型Mistral Large;法国新星Mistral挑战 OpenAI 霸主地位

&#x1f989; AI新闻 &#x1f680; Mistral发布语言大模型Mistral Large 摘要&#xff1a;Mistral Large 是 Mistral AI 公司最新发布的旗舰语言模型&#xff0c;具备顶尖水平的推理能力。它主要被设计用于处理复杂的多语言推理任务&#xff0c;比如文本理解、转换和代码生…

上位机图像处理和嵌入式模块部署(上、下位机通信的三个注意点)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果最终部署在客户现场的是一个嵌入式设备&#xff0c;那么上位机在做好了算法编辑和算法部署之后&#xff0c;很重要的一步就是处理上位机和下位…