zoukankan      html  css  js  c++  java
  • 填字母游戏

    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));
            }
        }
    }
  • 相关阅读:
    circle loss:统一softmax CrossEntropy loss 和 triplet loss / 2020
    针对PPO的一些Code-level性能优化技巧
    【李南江】从零玩转TypeScript
    Python编程题16--最长不重复子串
    Python编程题15--RGB字符串排序
    Maven教程
    python的pandas处理txt文件
    python将JPG图片转换为PDF
    使用svd对信号矩阵降噪
    使用ffmpeg命令处理媒体文件
  • 原文地址:https://www.cnblogs.com/jizhidexiaobai/p/8652974.html
Copyright © 2011-2022 走看看