蓝桥杯JAVA版答案——历年真题——填字母游戏

更多JAVA版答案移步我的博客:蓝桥杯JAVA版答案汇总

本题考查

记忆化深搜、博弈论相关知识

思路

注:1为胜、0为平、-1为输
使用map数组保存之前深搜的结果,以便减少深搜的时间复杂度,减少程序运行时间。
关于如何判断胜负平的逻辑十分简单,可以理解为就是每一步都对可能的情况进行判断。需要注意的是代码21行的复原操作,在进行完一个位置的判断后必须复原该位置,否则会影响后面的逻辑判断
关于博弈论的习题有成熟解体模板可以参考,而本题最关键的就是如何不超时,如果单纯深搜不记录之前的计算结果的话,会导致超时,所以进行优化的方法是使用变量map记录每一个已经确定结果的情况。并通过代码第六行获取记忆数据从而减少程序运行时间。优化方法关键代码第6、24行。

这里需要有一个点需要说明,代码第7、8行同样是确定结果的情况为什么不加入map当中呢,原因就是,从map中取结果比直接判断字符串中是否有“LOL”与“*”相比要慢,也就是说,把代码7、8行的情况加入map当中,则代码会超时,总体只能取得60分。

参考:

  1. https://www.twblogs.net/a/5cdb331bbd9eee6726ca2438/zh-cn(80分版)
  2. https://blog.csdn.net/krypton12138/article/details/79631866(20分版)

在此感谢两位博主的分享

AC代码

import java.util.HashMap;
import java.util.Scanner;
public class Main {
	static HashMap<String, Integer> map = new HashMap<String, Integer>();
	static int judge(String str) {
		if(map.containsKey(str))						return map.get(str);
		if(str.indexOf("LOL") != -1)					return -1;
        if(str.length()<3||str.indexOf("*") == -1)		return 0;
        int res = -1;
        char[] arr = str.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] == '*'){
                arr[i] = 'L';
                res = Math.max(res,-judge(new String(arr)));
                if(res == 1)	break;
                else {
                	arr[i] = 'O';   
                    res = Math.max(res,-judge(new String(arr))); 
                    if(res == 1)	break;
                }
                arr[i] = '*';
            }
        }
        if(!map.containsKey(str)) 	map.put(str, res);
        return res;
	}

	public static void main(String[] args) {
		Scanner scaner = new Scanner(System.in);
		int round = scaner.nextInt();
		for (int i = 0; i < round; i++)
			System.out.println(judge(scaner.next()));
		scaner.close();
	}
}

AC的证明
蓝桥杯JAVA版答案——历年真题——填字母游戏_第1张图片

你可能感兴趣的:(蓝桥杯,JAVA)