标题:填字母游戏
小明经常玩 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() + " ";
}
}
简单的剪枝,希望没超。