第八届蓝桥杯国赛Java b组 填字母游戏

12 篇文章 0 订阅
5 篇文章 0 订阅

标题:填字母游戏



小明经常玩 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,否则按无效代码处理。


package di8jie;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class LOL填字母5 {
	/*
	 * 
	 * 标题:填字母游戏
	 * 
	 * 小明经常玩 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,否则按无效代码处理。
	 * 
	 * 
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println();
		Scanner sc = new Scanner(System.in);

		int n = sc.nextInt();
		sc.nextLine();
		while (n > 0) {
			String str = sc.nextLine();
			int[] in = new int[str.length()];
			for (int i = 0; i < in.length; i++) {
				if (str.charAt(i) == 'L') {
					in[i] = 1;
				} else if (str.charAt(i) == 'O') {
					in[i] = 2;
				}
			}

			System.out.println("AWS" + dg2(in));

			n--;
		}

	}
	static Map<String,Integer> m =new HashMap<>();

	public static int dg2(int[] in) {
		if(m.containsKey(toS(in))){
			return m.get(toS(in));
		}

		String s =toS(in);
		if (s.split("121").length >= 2) {
			m.put(toS(in), -1);
			return -1;
		}

		// 没有空可以下了 平局
		boolean is = true;
		for (int i : in) {
			if (i == 0) {
				is = false;
			}
		}
		if (is) {
			m.put(toS(in), 0);
			return 0;
		}

		int label = 1;

		for (int i = 0; i < in.length; i++) {
			if (in[i] != 0) {
				continue;
			}
			// 如果                            无论我怎么走                             给你都有一个办法返回1                       那么我就应该-1
			// 如果                            我有个办法能让你                   无论怎么走都是-1                                   那么我应该是1
			// 不然 就是0

			in[i] = 1;// L
			label = Math.min(label, dg2(in));
			in[i] = 0;// 回溯

			in[i] = 2;// 0
			label = Math.min(label, dg2(in));
			in[i] = 0;// 回溯

		}
		// System.out.println("return"+label);
		m.put(toS(in), -label);
		return -label;
	}

	
	public static String toS(int []in){
		
		StringBuffer sb = new StringBuffer();
		for (int i : in) {
			sb.append(i);
		}
		return " " + sb.toString() + " ";
	}
}


简单的剪枝,希望没超。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值