• 填字母游戏


    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));
            }
        }
    }
  • 相关阅读:
    如何在iTerm2中配置oh my zsh?
    sublime中格式化jsx文件
    ES6 new syntax of Literal
    ES6 new syntax of Rest and Spread Operators
    How to preview html file in our browser at sublime text?
    ES6 new syntax of Default Function Parameters
    ES6 new syntax of Arrow Function
    七牛云2018春招笔试题
    Spring-使用注解开发(十二)
    Spring-声明式事物(十一)
  • 原文地址:https://www.cnblogs.com/jizhidexiaobai/p/8652974.html
Copyright © 2020-2023  润新知