• Java实现蓝桥杯历届试题填字母游戏


    题目描述
    小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说:
    “我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了”。
    
    K大师在纸上画了一行n个格子,要小明和他交替往其中填入字母。
    
    并且:
    
    1. 轮到某人填的时候,只能在某个空格中填入L或O
    2. 谁先让字母组成了“LOL”的字样,谁获胜。
    3. 如果所有格子都填满了,仍无法组成LOL,则平局。
    
    小明试验了几次都输了,他很惭愧,希望你能用计算机帮他解开这个谜。
    
    本题的输入格式为:
    第一行,数字n(n<10),表示下面有n个初始局面。
    接下来,n行,每行一个串,表示开始的局面。
      比如:“******”, 表示有6个空格。
      “L****”,   表示左边是一个字母L,它的右边是4个空格。
    
    要求输出n个数字,表示对每个局面,如果小明先填,当K大师总是用最强着法的时候,小明的最好结果。
    1 表示能赢
    -1 表示必输
    0 表示可以逼平
    
    
    例如,
    输入:
    4
    ***
    L**L
    L**L***L
    L*****L
    
    则程序应该输出:
    0
    -1
    1
    1
    
    资源约定:
    峰值内存消耗 < 256M
    CPU消耗  < 1000ms
    
    
    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
    
    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
    注意:主类的名字必须是:Main,否则按无效代码处理。
    
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Scanner;
     
    class Main{
    	static String str;
    	static Map<String, Integer>map=new HashMap<>();
    	public static void main(String[] args) {
    		Scanner s=new Scanner(System.in);
    		int n=s.nextInt();
    		str=s.nextLine();
    		long currentTimeMillis = System.currentTimeMillis();
    		for(int i=0;i<n;i++)
    		{
    			str=s.nextLine();
    			System.out.println(adv());//-1 -1 1   L***L***L
    		}
    //	System.out.println(System.currentTimeMillis()-currentTimeMillis);
    	}
    	private static int adv() {//预处理
    		
    		int index=0;
    		int a,b,len1 = 0,len2=0;
    		index=str.indexOf("*L*");
    		if(index>0)
    		{
    			String temp=str;
    			str=temp.substring(0,index+2);
    			for(int i=0;i<str.length();i++)
    				if(str.charAt(i)=='*')
    					len1++;
    			a=f();
    			str=temp.substring(index+1);
    			for(int i=0;i<str.length();i++)
    				if(str.charAt(i)=='*')
    					len2++;
    			b=f();
    			str=temp;
     
    			return u(a, b, len1, len2);
    			
    		}else
    		{
    		  return f();
    		}
    	}
    	private static int u(int a,int b,int len1,int len2)
    	{
    		
    		if((a==1&&len1==1)||(b==1&&len2==1))
    			return 1;
    		
    		if(a==1&&b==1)
    			return -1;
    		if(a==b)   
    			return a;
    		
    		if(a!=0&&b!=0) 
    			return 1;
    		
    		if(a==1||b==1)
    			return 1;
    		
    		if(a==-1&&b==0)  
    			return (len2%2==0)?a:-a;
    		
    		if(a==0&&b==-1)
    			return (len1%2==0)?b:-b;
    		
    		if(a==1&&b==0)
    		{
    			if(len1==1)return 1;
    			return (len2%2==0)?a:-a;
    		}
    		
    		if(len2==1) return 1;
    		return (len1%2==0)?b:-b;
    		
    		
    	}
    	private static int f() {
    		
    		if(str.contains("*OL")||str.contains("L*L")||str.contains("LO*"))
    		  return 1;//终止条件
    		if(!str.contains("*"))
    			return 0;
    		
    		//如果L****或者*****L
    		if((str.startsWith("L***")&&!str.substring(1).contains("O")&&!str.substring(1).contains("L"))
    		   ||
    		(str.endsWith("***L")&&!str.substring(0,str.length()-1).contains("O")&&!str.substring(0,str.length()-1).contains("L")))
    			return (str.length()%2==0)?1:-1;
    		
    		List<Integer> indexs=index(str);//返回*号下标数组
    		
    		int [] result=new int[indexs.size()*2];
    		int k=0;
    		for(int i=0;i<indexs.size();i++)
    		{
    			//换
    			str=rep(str, indexs.get(i), 'L');
    			
    			if(map.containsKey(tri(str))){
    				result[k++]=map.get(tri(str));
    			}else{
    				map.put(tri(str),result[k++]=f());
    			}
    			
    			if(result[k]==-1)
    			{
    				str=rep(str, indexs.get(i), '*');
    				return 1;
    			}
    				
    				
    			str=rep(str, indexs.get(i), 'O');
    			
    			if(map.containsKey(tri(str))){
    				result[k++]=map.get(tri(str));
    			}else{
    				map.put(tri(str),result[k++]=f());
    			}
    			
    			if(k<result.length&&result[k]==-1)
    			{
    				str=rep(str, indexs.get(i), '*');
    				return 1;
    			}
    			
    			str=rep(str, indexs.get(i), '*');
    		}
    		
    		return vote(result);
    		
    	}
     
    	private static String tri(String str)
    	{
    		int start=str.indexOf('*');
    		int end=str.lastIndexOf('*');
    		if(start-2<0) start=2;
    		if(end+3>=str.length()) end=str.length()-3;
    		str=str.substring(start-2,end+3); 
    		
    		if(str.startsWith("OL*")||str.startsWith("OO*")||str.startsWith("LL*"))
    			str=str.substring(1);
    		if(str.endsWith("*LO ")||str.endsWith("*OO")||str.endsWith("*LL"))
    			str=str.substring(0,str.length()-1);
    		return str;
    	}
    	
    	//replace函数
    	private static String rep(String str,int index,char a)
    	{
    		return str.substring(0,index)+a+str.substring(index+1);
    	}
    	
    	//vote函数(全为1返回-1,有一个-1返回1)
    	private static int vote(int []a)
    	{
    		int min=1;
    		for(int i=0;i<a.length;i++)
    		{
    			min=min<a[i]?min:a[i];
    		}
    		return 0-min;
    	}
    	
    	//返回*下标数组
    	private static List index(String nextLine) {
    		List<Integer> list=new ArrayList<Integer>();
    		int qian=0;
    		while(nextLine.contains("*"))
    		{
    			int index=nextLine.indexOf("*");
    			list.add(qian+index);
    			nextLine=nextLine.substring(index+1);
    			qian+=index+1;
    		}
    		return list;
    	}
    }
    
  • 相关阅读:
    C++ Primer读书笔记
    谨慎使用多线程中的fork
    C++中多线程与Singleton的那些事儿
    浅谈指针的比较
    条件变量的陷阱与思考
    2014年终总结
    循环队列的一种实现模型
    react-native使用jest、enzyme进行单元测试
    富文本编辑器开发原理
    模拟实现单元测试中的异步测试
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13078111.html
Copyright © 2020-2023  润新知