蓝桥杯:拉马车

2023-11-17

目录

题目描述

输入描述

        输入为 2 行,2 个串,分别表示 A、B 双方初始手里的牌序列。我们约定,输入的串的长度不超过 30。

输入输出样例

        输入

        输出

题目分析:     

        列表+递归

AC代码(Java):


题目描述

小的时候,你玩过纸牌游戏吗?

有一种叫做"拉马车"的游戏,规则很简单,却很吸引小朋友。

其规则简述如下:

假设参加游戏的小朋友是 A 和 B ,游戏开始的时候,他们得到的随机的纸牌序列如下:

A 方:[K, 8, X, K, A, 2, A, 9, 5, A]

B 方:[2, 7, K, 5, J, 5, Q, 6, K, 4]

其中的 X 表示 "10",我们忽略了纸牌的花色。

从 A 方开始,A、B双方轮流出牌。

当轮到某一方出牌时,他从自己的纸牌队列的头部拿走一张,放到桌上,并且压在最上面一张纸牌上(如果有的话)。

此例中,游戏过程:

A 出 K,B 出 2,A 出 8,B 出 7,A 出 X,此时桌上的序列为:

K,2,8,7,X

当轮到 B 出牌时,他的牌 K 与桌上的纸牌序列中的 K 相同,则把包括 K 在内的以及两个 K 之间的纸牌都赢回来,放入自己牌的队尾。注意:为了操作方便,放入牌的顺序是与桌上的顺序相反的。

此时,A、B双方的手里牌为:

A 方:[K, A, 2, A, 9, 5, A]

B 方:[5, J, 5, Q, 6, K, 4, K, X, 7, 8, 2, K]

赢牌的一方继续出牌。也就是 B 接着出 5,A 出 K,B 出 J,A 出 A,B 出 5,又赢牌了。此时桌上的序列为:

5,K,J,A,5

此时双方手里牌:

AA 方:[2, A, 9, 5, A]

BB 方:[Q, 6, K, 4, K, X, 7, 8, 2, K, 5, A, J, K, 5]

注意:更多的时候赢牌的一方并不能把桌上的牌都赢走,而是拿走相同牌点及其中间的部分。但无论如何,都是赢牌的一方继续出牌,有的时候刚一出牌又赢了,也是允许的。

当某一方出掉手里最后一张牌,但无法从桌面上赢取牌时,游戏立即结束。

对于本例的初始手牌情况下,最后 A会输掉,而 B 最后的手里牌为:

9K2A62KAX58K57KJ5

本题的任务就是已知双方初始牌序,计算游戏结束时,赢的一方手里的牌序。当游戏无法结束时,输出 -1。

输入描述

        输入为 2 行,2 个串,分别表示 A、B 双方初始手里的牌序列。我们约定,输入的串的长度不超过 30。

输入输出样例

示例

        输入

96J5A898QA
6278A7Q973

        输出

2J9A7QA6Q6889977

题目分析:     

        列表+递归

        (1):先看数据,我们需要三个单位来存放数据,题目给出的条件已知A方和B方只需要进行第一张牌出去,手牌的最后进来,符合队列的特性(先进先出)。所以双方的手牌可以用队列来存储。因为我个人习惯用列表,所以我就用列表来做。

        (2):再看桌上的纸牌(下面统一用中间牌堆来表示),每次从A or B的手牌里面拿到第一张,添加到末尾,也符合队列的特性,但是它要频繁的截取一段出来,然后添加到A or B的后面,所以还是选择了使用列表来处理 中间牌堆 ,这样方便添加和取出。

        (3):关于输入的数据,需要注意,当任意一方发牌结束之后,也就是往中间牌堆放牌,放完牌之后如果没有得到牌(也就是中间牌堆中没有由两个相同字符组成的字段(如K 2 7 8 X K)),那么就要结束循环,而不用另一方接着放牌(我做题的时候没有考虑这点,以为是A放完牌之后B接着放牌,这两个放完之后才考虑是否为空的情况,结果错了)。

        然后看步骤

        题目要求是A先放牌,然后判断中间牌堆里面有没有和A放入的牌相同的牌,如果有,那么就将牌放进去,然后找到这张牌第一次出现的次数,然后将这一段字符(如7 K 2 7 8 X K这段相同字符段就是K 2 7 8 X K)取反,在添加到A里面,然后A继续出牌。B也是同理。

        出牌就可以用循环来控制和检测A和B的出牌,出牌完之后,就进行判断中间牌堆里面是否包含该牌,如果包含,就将包含的字段取反添加到他们的后面,然后继续调用出牌的方法(算递归吧?~)

AC代码(Java):

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
//创建一个中间列表,用来存放A,B的出牌
	static List<Character> result = new ArrayList<>();
	//创建A和B的列表,用来存放他们的手牌(队列也可以)
	static List<Character> A;
	static List<Character> B;
	public static void main(String[] args){
		//拿数据
		Scanner scan = new Scanner(System.in);
		String s1 = scan.nextLine();
		String s2 = scan.nextLine();
		//通过字符串初始化列表
		A = getList(s1);
		B = getList(s2);
		//然后循环依次往中间列表中添加数据(出牌)
		//A和B都不为空的时候才继续出牌,同时定义一个res,记录循环次数,当循环太多时,就强制中断
		int res = 0;
		while(A.size()!=0 && B.size()!=0){
			//先是A出牌,然后B出牌,如果A出牌完成了一段字符的闭合,如:K 2 7 8 X K,
			//那么在方法里面会让他继续先出牌一次
			dateIntoList(A);
			//如果A出完牌为空了,就结束循环,B不再出牌
			if(A.size()==0){
				break;
			}
			dateIntoList(B);
			//如果B出完牌为空了,也结束循环,A不再出牌
			if(B.size()==0){
				break;
			}
			//强制中断控制
			res++;
			if(res>100000){
				System.out.println(-1);
				break;
			}
		}
		//输出部分
		if(A.isEmpty()){
			//如果A是空的话,就输出B
			for(char ch : B){
				System.out.print(ch);
			}
		}else{
			for(char ch : A){
				System.out.print(ch);
			}
		}
	}
	//往中间列表添加数据
	/**
	 * @param list:这个出牌者当前的手牌
	 * */
	public static void dateIntoList(List<Character> list){
		//拿出第一张手牌
		//list.remove方法会返回删除的数据
		char c = list.remove(0);
		//判断中间列表(牌堆)里面有没有跟这张牌相同的,如果有,就形成了一段闭合的字符
		if(result.contains(c)){
			//如果中间列表里面有这个字符,那么代表相同,将当前这个手牌添加进去
			//然后调用reverse()方法将这段字符添加到对应的列表里面(根据name来判断 A or B)
			result.add(c);
			reverse(list,c);
		}else{
			//如果中间列表里面没有这个字符,那么直接添加进去就可以了
			result.add(c);
		}
	}
	//如果完成一段闭合,如K 2 7 8 X K,则将这段取反添加到出牌者后面
	/**
	 * @param list:这个出牌者当前的手牌
     * @param c:表示出现相同字段的字符
	 * */
	public static void reverse(List<Character> list,char c){
		//先拿到这个字符出现第一次的下标 
		int index = result.indexOf(c);
		//因为要取反,所以我们从最后一个数字开始删除
		while(index<result.size()){
			char ch = result.remove(result.size()-1);
			list.add(ch);
		}
		//将字符段取反全部添加到list之后,就要重新进行出牌
			dateIntoList(list);
	}
    //字符串转换成列表
    public static List getList(String str){
      List<Character> list = new ArrayList<>();
      for(int i = 0;i<str.length();i++){
        list.add(str.charAt(i));
      }
      return list;
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝桥杯:拉马车 的相关文章

  • 蛇形方阵

    题目描述 给出一个不大于 9 的正整数 n 输出 n n 的蛇形方阵 从左上角填上 1 开始 顺时针方向依次填入数字 如同样例所示 注意每个数字有都会占用 3 个字符 前面使用空格补齐 输入 4 输出 1 2 3 4 12 13 14 5
  • Acwing 842. 排列数字

    dfs int u 搜索第u个位置上可以放哪个数字 include
  • 蓝桥杯:基础练习 特殊回文数(java实现)

    问题描述 123321是一个非常特殊的数 它从左边读和从右边读是一样的 输入一个正整数n 编程求所有这样的五位和六位十进制数 满足各位数字之和等于n 输入格式 输入一行 包含一个正整数n 输出格式 按从小到大的顺序输出满足条件的整数 每个整
  • C++11 删除 字符串中的空格

    include
  • JAVA中的JeeSite框架基本简介

    JAVA的主流框架是很多的 每一个框架都有它的适用项目和条件 所有JAVA程序员都熟悉的肯定是常用的四大框架 而JeeSite这个框架使用的人却不是很多 但是这个框架却有它的独到之处 稳定 高效 调用方便 这里对JeeSite做一个简单的介
  • openGL之API学习(一九三)glGenTextures

    生成纹理单元名 单元名不一定是连续的 但是没有使用的 单元名是相对GL TEXTURE0的 对于单元名1 其实是GL TEXTURE0 1 glGenTextures产生的是一个比较小的整数id 纹理单元名 glActiveTexture激
  • Python蓝桥杯 基础练习 十六进制转八进制

    def huan n n format int n 16 o print n x int input for i in range 1 x 1 n input huan n format o 将数据格式化为八进制 int n 16 返回字符
  • 蓝桥云课——长草 Python (广度优先遍历)

    这种题应该不是Python组的吧 跑了跑其他人的题解发现最后一组解都会超时 权当抛砖引玉了吧 题目地址 长草 先上BFS模板 def Bfs 参数 while quene 空 cur quene pop 0 弹出队列第一项 for code
  • 蓝桥杯单片机第14届省赛客观题目+程序题目+程序题参考答案

    目录 客观题题目 程序题题目 程序题参考答案 main h main c Init h Init c SMG h SMG c DSQ h DSQ c YanShi h YanShi c JZKey h JZKey c ds1302 h ds
  • 2018年第九届蓝桥杯C/C++A组省赛 题面&部分题解

    首先 原题 链接 https pan baidu com s 1UzRN6Mf2Dwp0263F MMESg 密码 2ryh 第一题 标题 分数 1 1 1 2 1 4 1 8 1 16 每项是前一项的一半 如果一共有20项 求这个和是多少
  • 蓝桥杯:斐波那契数列最大公约数

    题目表示的很明确 要用两个算法 斐波那契数列是很经典的dp问题 最大公约数是很经典的辗转相除法 从而我理所应当的就定义一个数组存放斐波那契数列 long long int F 2021 0 F 1 1 F 2 1 for int i 3 i
  • 蓝桥杯模拟、思维

    本文是根据博主安然无虞的文章进行我的思维训练和练习 下面是我的练习代码和思路 1 换酒问题 include
  • 2023蓝桥杯python 组试题A:2023

    题目 请求出在 12345678 至 98765432 中 有多少个数中完全不包含 2023 完全不包含 2023 是指无论将这个数的哪些数位移除都不能得到 2023 例如 20322175 33220022 都完全不包含 2023 而 2
  • 2022年第十四届蓝桥杯模拟赛【核酸日期】C语言详解

    目录 题目 思路 代码实现 题目 核酸日期 问题描述 如果周一做核酸 周二显示核酸天数为 1 天 周三显示 2 天 以此类推 周六显示 5 天 周日显示 6 天 小蓝在某一天做了一次核酸 请问他的核酸显示为几天 已知做核酸和查看核酸不是在同
  • 蓝桥杯-稍大的字符串

    题目 标题 稍大的串 串可以按照字典序进行比较 例如 abcd 小于 abdc 如果给定一个串 打乱组成它的字母 重新排列 可以得到许多不同的串 在这些不同的串中 有一个串刚好给定的串稍微大一些 科学地说 它是大于已知串的所有串中最小的串
  • 第14届蓝桥杯C++B组省赛

    文章目录 A 日期统计 B 01 串的熵 C 冶炼金属 D 飞机降落 E 接龙数列 F 岛屿个数 G 子串简写 H 整数删除 I 景区导游 J 砍树 今年比去年难好多 Update 2023 4 10 反转了 炼金二分没写错 可以AC了 U
  • 【第十四届蓝桥杯三月真题刷题训练——第 24 天 (3.27)& 旋转 & 附近最小 & 扫地机器人 & 窗口】

    第一题 旋转 import java util Scanner public class Main static int N 300 static int a new int N N static int b new int N N pub
  • shared_ptr使用场景、陷阱、性能分析,使用建议

    1 std shared ptr使用场景 include
  • 判断完全数-第11届蓝桥杯省赛Python真题精选

    导读 超平老师的Scratch蓝桥杯真题解读系列在推出之后 受到了广大老师和家长的好评 非常感谢各位的认可和厚爱 作为回馈 超平老师计划推出 Python 蓝桥杯真题解析100讲 这是解读系列的第27讲 判断完全数 本题是2020年6月20
  • 字符串处理-第11届蓝桥杯省赛Python真题精选

    导读 超平老师的Scratch蓝桥杯真题解读系列在推出之后 受到了广大老师和家长的好评 非常感谢各位的认可和厚爱 作为回馈 超平老师计划推出 Python 蓝桥杯真题解析100讲 这是解读系列的第26讲 字符串处理 本题是2020年6月20

随机推荐

  • Visual Studio 2022 安装

    1 官网下载 打开浏览器 输入微软官网https visualstudio microsoft com zh hans downloads 下载社区版安装 2 安装社区版 3 安装时组件选择通用Windows10开发平台C 选项
  • python实现抢劵_手把手教你用python抢京东大额神券

    一 背景介绍 我们经常能看到京东上有满200减100之类的大额神券 但是当自己激动的等在电脑旁 手拿鼠标 眼盯屏幕 等着倒计时慢慢临近 期待抢到自己喜爱的优惠券 然而最终得到的往往是 券已抢完 为了弥补手速的缺憾 今天我教大家如何用pyth
  • CentOS 8: yum 设置为阿里源

    1 将源文件备份 cd etc yum repos d mkdir backup mv repo backup 2 下载阿里源文件 curl o etc yum repos d CentOS Base repo http mirrors a
  • [Qt学习笔记]Qt动态切换控件样式属性方法

    目录 1 介绍 2 实现过程 3 效果展示 1 介绍 在编程过程中我们一般使用setStyleSheet 函数来设置控件的样式属性 包括颜色 边框 透明度等属性 如果不同的控件和样式直接在代码中设置 会造成无法统一管理的缺点 反复书写样式属
  • C语言怎么用char输出多个字母,c语言输入一个字符串怎么间隔输出

    Q1 c语言中 如何利用指针对字符串每隔几个输出一个 隔三个 输出一个 也就是每四个输出一个 char s abcdefgh char p s int i 0 for p s p p i if i 4 0 putchar p Q2 c语言
  • 等额本息贷款每月还款金额推导过程

    假设贷款总额是A 而每月利息是b 总共360期 目标是计算每个月应该给银多少钱 推导过程如下 设每个月还银行的本金为 m n 1 n
  • Pattern.compile的flag参数

    Pattern compile函数 Pattern Pattern compile String regex int flag regex为正则表达式 flag的取值范围如下 Pattern CANON EQ 当且仅当两个字符的 正规分解
  • (总结许多容易犯的错误)Ubuntu14.04+cuda8.0+gtx1080+cudnn5.1配置教程

    需要注意 不能按照网上大多数cuda8 0 gtx1080的方法来做 因为他们这些方法都忽略了一个重要的问题 NVIDIA官方的版本更新会影响兼容性导致Ubuntu系统无法进入登录界面 例如 cuda 8 0 27 linux版本对应NVI
  • 数组解构赋值与扩展运算符...

    解构 let a b c 1 3 5 扩展运算符
  • 「从0到1搭建自己的UI组件库」-- button组件

    写在前面 我是 沸羊羊 昵称来自于姓名的缩写 fyy 之前呕心沥血经营的博客因手残意外注销 现经营此账号 本人是个小菜 正向着全栈工程师的方向努力着 文章可能并不高产 也很基础 但每写一篇都在用心总结 请大佬勿喷 如果您对编程有兴趣 请关注
  • vue3封装简易的vue-echarts

    项目场景 数据可视化开发 采用的技术栈是vue3 echarts router 问题描述 在vue2中 才开始开发数据可视化大屏 都是用echarts 之后改用为vue echarts组件 但是到了vue3之后 组件会有一些小问题 所以准备
  • 如何强制解锁或删除被占用的文件或文件夹 - ForceDelete绿色强制文件删除工具

    你可能时常遇到无法删除Windows上的文件和文件夹的情况 并且会收到 无法删除文件 访问被拒绝 或 该文件已被其他程序打开 诸如此类的错误消息 这意味着这些文件和文件夹在Windows中被锁定 无法以常规方式删除 你可以试试ForceDe
  • 计算机如何根据人脸估计年龄,人脸图像算法研究(1)

    今天给大家带来一篇 人脸识别中的年龄估计技术 年龄特征作为人类的一种重要生物特征 计算机要如何基于人脸图像估计年龄呢 概述 简单地说 基于人脸图像的年龄估计是指机器根据面部图像推测出人的大概年龄或所属的年龄范围 年龄段 基于人脸图像的年龄估
  • 4.4.5 密码验证(2)

    4 当且仅当含数字和字母的密码验证 如果密码当且仅当包含数字和字母 那么该密码的强度是中等强度 当然 它的安全性一般 以下正则表达式能够验证当且仅当包含数字和字母的密码 da zA Z d a zA Z da zA Z 74 正则表达式 7
  • C++ 的四种类型转换

    背景 C语言中强制类型转换可以随意转换我们想要的类型 格式如下 类型 变量名 那么为什么C 还要引入新的4种类型转换呢 1 新的类型转换控制符可以很好的控制类型转换的过程 允许控制各种类型不同的转换 2 C 的类型转换控制服能告诉程序员或读
  • 【毕业设计】Python_学生校园消费行为

    资源下载 https download csdn net download wouderw 87357462 1 分析学校校园消费行为的目的 分析学生的消费行为和食堂的运营状况 为食堂运营提供建议 构建学生消费细分模型 为学校判定学生的经济
  • VT是什么?怎么打开教程

    装过虚拟机的朋友都知道 要想虚拟出cpu 就必须电脑打开VT VT指的是CPU的虚拟化技术 有了它就可以单CPU模拟多CPU并行 这样才可以虚拟出电脑出来 而如果你的bios没有打开VT的话 是不能创建虚拟机的 下面就教大家怎么打开VT 1
  • 华为员工自曝,工作四年,每天都哭想裸辞!

    架构师大咖 架构师大咖 打造有价值的架构师交流平台 分享架构师干货 教程 课程 资讯 架构师大咖 每日推送 公众号 该公众号已被封禁 进入华为是一项令人向往的机会 但它并不适合每个人 许多人都希望能够进入这家公司 但实际上 它要求员工具备卓
  • 加权回归估计_比率估计与回归估计

    本章讨论简单随机抽样和分层随机抽样下比率估计和回归估 计的构造及性质 要求 掌握总体比率 比率估计量及回归估计量的概念 了解比率估计量 回归估计量的偏倚 方差及方差的估计量 掌握应用比率估计量及回归估计量的条件 抽样调查从本质上看是利用不完
  • 蓝桥杯:拉马车

    目录 题目描述 输入描述 输入为 2 行 2 个串 分别表示 A B 双方初始手里的牌序列 我们约定 输入的串的长度不超过 30 输入输出样例 输入 输出 题目分析 列表 递归 AC代码 Java 题目描述 小的时候 你玩过纸牌游戏吗 有一