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
import java.util.*; public class Main { static Map<String, Integer> map = new HashMap<String, Integer>(); // -1: 必输,0: 平局, 1: 必赢 static int f(char[] x) { String s = new String(x); if (map.get(s) != null) return map.get(s); if (s.contains("LOL")) { map.put(s, -1); return -1; } if (s.contains("*") == false) { map.put(s, 0); return 0; } boolean ping = false; for (int i = 0; i < x.length; i++) { if (x[i] == '*') { try { x[i] = 'L'; { int t = f(x); if (t < 0) { map.put(s, 1); return 1; } if (t == 0) ping = true; } x[i] = 'O'; { int t = f(x); if (t < 0) { map.put(s, 1); return 1; } if (t == 0) ping = true; } } finally { x[i] = '*'; } } } if (ping) { map.put(s, 0); return 0; } map.put(s, -1); return -1; } static int game(String s) { map.clear(); return f(s.toCharArray()); } public static void main(String[] args) { Scanner scan = new Scanner(System.in); List<Integer> list = new ArrayList<Integer>(); int n = Integer.parseInt(scan.nextLine().trim()); for (int i = 0; i < n; i++) { list.add(game(scan.nextLine().trim())); } for(int i = 0; i < list.size(); i ++) { System.out.println(list.get(i)); } } }