Loading

填字母游戏

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));
        }
    }
}

 

posted @ 2018-03-26 19:22  机智的小白  阅读(394)  评论(0编辑  收藏  举报