【拉马车】 蓝桥杯 历届试题 java

查看题目

总结

  1. 桌上牌的进出顺序(先进后出)符合栈的特点,定义stack用于存放桌上牌的顺序,
    持牌人的出牌顺序(先进先出)符合队列的特点,定义queue1、queue2分别存放A、B两方牌顺序;
  2. 定义flag=1表示轮到A方出牌,flag=2表示轮到B方出牌;
  3. 首先由A方出牌,stack接收牌的同时查看stack里面是否存在一样的牌面,【若存在】则把A方队列queue1的首元素移至队尾,再把栈stack的元素一个个从栈顶移至queue1队尾,直到遇到相同的牌面;【若不存在】就只是往栈stack里添加queue1的首元素,并且查看queue1里是否有剩余元素,【若无】则B方赢,输出queue2队列里的所有元素,游戏结束,【若有】则令flag=2,代表接下来B方出牌,接下来的情况与A出牌类似。
    4.需注意 当游戏无法结束时,输出-1,由于输入的串的长度不超过30,如果游戏能结束,或许两人出牌的次数不会超过10000,如果超过了,应该是游戏无法结束的情况。

代码

import java.util.Scanner;
import java.util.Stack;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin=new Scanner(System.in);
		
		Stack <String> stack;
		Queue<String> queue1,queue2;
		int flag,id;
		String s1,s2,top;
		
		while(cin.hasNext()) {
			
			stack = new Stack<String>();  //先进后出(桌面收牌)
			queue1 = new LinkedList<String>();	  //先进先出(玩家1存牌)
			queue2 = new LinkedList<String>();	  //先进先出(玩家2存牌)
			
			s1=cin.next();
			s2=cin.next();
			
			flag=1;
			id=0;
			
			for(int i=0;i<s1.length();i++) {
				queue1.offer(s1.charAt(i)+"");
				queue2.offer(s2.charAt(i)+"");
			}
			
			while(id!=10000) {
				
				id++;
				top="";
				
				if(flag==1) {  //A发牌
					
					top=queue1.poll();  //取出第一张牌
					
					if(stack.contains(top)) {  
						
						queue1.offer(top);
						while(!(stack.peek()).equals(top) ) {
							queue1.offer(stack.pop());
						}
						queue1.offer(stack.pop());
						
						continue;
					}else {
						stack.push(top);
						if(queue1.isEmpty()) {
							for(String q : queue2){
					            System.out.print(q);
					        }
							System.out.println();
							break;
						}
						flag=2;
					}
					
				}
					
				
				if(flag==2) {  //B发牌
					
					top=queue2.poll();  //取出第一张牌
						
					if(stack.contains(top)) {  
						
						queue2.offer(top);
						while(!(stack.peek()).equals(top)) {
							queue2.offer(stack.pop());
						}
						queue2.offer(stack.pop());
						
						continue;
					}else {
						stack.push(top);
						if(queue2.isEmpty()) {
							for(String q : queue1){
					            System.out.print(q);
					        }
							System.out.println();
							break;
						}
						flag=1;
					}
					
				}
				
			}
			
			if(id==10000)
				System.out.println(-1);//游戏无法结束
			
		}
		
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值