第八届蓝桥杯个人省赛(软件类)C组第八题拉马车

166 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

 
标题:拉马车

小的时候,你玩过纸牌游戏吗?
有一种叫做“拉马车”的游戏,规则很简单,却很吸引小朋友。

其规则简述如下:
假设参加游戏的小朋友是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
此时双方手里牌:
A方:[2, A, 9, 5, A]
B方:[Q, 6, K, 4, K, X, 7, 8, 2, K, 5, A, J, K, 5]

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

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

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

9K2A62KAX58K57KJ5

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

输入为2行,2个串,分别表示A、B双方初始手里的牌序列。
输出为1行,1个串,表示A先出牌,最后赢的一方手里的牌序。

例如,
输入:
96J5A898QA
6278A7Q973

则程序应该输出:
2J9A7QA6Q6889977

再比如,
输入:
25663K6X7448
J88A5KJXX45A

则程序应该输出:
6KAJ458KXAX885XJ645

我们约定,输入的串的长度不超过30

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms


请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。


用StringBuilder来直接修改增减字符串比较使用这道题。


package name;

import java.util.*;

public class text {
	static StringBuilder A;//a的牌
	static StringBuilder B;//b的牌
	static StringBuilder C;//c是牌桌
	static int vip=0;
	public static void s1() {
		String temp=A.charAt(0)+"";
	
		
		
		if(C.indexOf(temp)==-1) {//开始判断字符串是否有出现没有出现返回-1不等于-1进入队列
			C.append(A.charAt(0));//把第一个字符打入牌桌
			A.delete(0, 1);//牌打出所以头减去1
			vip=1;
			
			
			
			
		}else {//如果不是-1证明他存在牌桌里面直接把牌给赢家s1、
			C.append(A.charAt(0));//把第一个字符打入牌桌
			A.delete(0, 1);//牌打出所以头减去1
			C.reverse();
			int win=C.indexOf(temp);
			int end=C.lastIndexOf(temp);
		
			for(int i =win;i<=end;i++) {
				A.append(C.charAt(i));//把获胜的区间送给A
			}
			C.delete(win, end+1);//删除已给出的数
			vip=0;//赢牌的继续打牌
			C.reverse();
			
		}
		
			
		
		
		
	}
	public static void s2() {
		String temp=B.charAt(0)+"";
		
		
		if(C.indexOf(temp)==-1) {//开始判断字符串是否有出现没有出现返回-1不等于-1进入队列
			C.append(B.charAt(0));//把第一个字符打入牌桌
			B.delete(0, 1);//牌打出所以头减去1
		
			vip=0;
			
			
			
			
			
		}else {//如果不是-1证明他存在牌桌里面直接把牌给赢家s2、
			C.append(B.charAt(0));//把第一个字符打入牌桌
			B.delete(0, 1);//牌打出所以头减去1
			C.reverse();
			int win=C.indexOf(temp);
			int end=C.lastIndexOf(temp);
			
			
			for(int i =win;i<=end;i++) {
				B.append(C.charAt(i));//把获胜的区间送给B
			}
			C.delete(win, end+1);//删除已给出的数
		
			vip=1;//赢牌的继续打牌
			C.reverse();
		}
		
		
		
		
	}
	public static void main(String[] args) {
		String num="25663K6X7448";
		String num1="J88A5KJXX45A";
		
		char[]number=num.toCharArray();
		
		char[]number1=num1.toCharArray();
		
		A=new StringBuilder(num.length());
		B=new StringBuilder(num1.length());
		
		C=new StringBuilder(10);
		
		
		for(int i=0;i<number.length;i++) {
			A.append(number[i]);
			
		}
		for(int i=0;i<number1.length;i++) {
			B.append(number1[i]);
		}
		
		
		
		
		for(;;) {
			if(vip==0) {//s1先打牌
				if(B.length()==0) {
					System.out.println("A  "+A+" B  "+B+"  C  "+C);
					break;
				}else if(A.length()==0) {
					System.out.println("A  "+A+" B  "+B+"  C  "+C);
					break;
				}
				s1();
				
			}else if(vip==1) {
				if(B.length()==0) {
					System.out.println("A  "+A+" B  "+B+"  C  "+C);
					break;
				}else if(A.length()==0) {
					System.out.println("A  "+A+" B  "+B+"  C  "+C);
					break;
				}
				
				s2();
				
			}
		}

	}

}