zoukankan      html  css  js  c++  java
  • java实现第七届蓝桥杯取球博弈

    题目9、取球博弈
    取球博弈
    
    两个人玩取球的游戏。
    一共有N个球,每人轮流取球,每次可取集合{n1,n2,n3}中的任何一个数目。
    如果无法继续取球,则游戏结束。
    此时,持有奇数个球的一方获胜。
    如果两人都是奇数,则为平局。
    
    假设双方都采用最聪明的取法,
    第一个取球的人一定能赢吗?
    试编程解决这个问题。
    
    输入格式:
    第一行3个正整数n1 n2 n3,空格分开,表示每次可取的数目 (0<n1,n2,n3<100)
    第二行5个正整数x1 x2 ... x5,空格分开,表示5局的初始球数(0<xi<1000)
    
    输出格式:
    一行5个字符,空格分开。分别表示每局先取球的人能否获胜。
    能获胜则输出+,
    次之,如有办法逼平对手,输出0,
    无论如何都会输,则输出-
    
    例如,输入:
    1 2 3
    1 2 3 4 5
    
    程序应该输出:
    + 0 + 0 -
    
    再例如,输入:
    1 4 5
    10 11 12 13 15
    
    程序应该输出:
    0 - 0 + +
    
    再例如,输入:
    2 3 5
    7 8 9 10 11
    
    程序应该输出:
    + 0 0 0 0
    
    
    资源约定:
    峰值内存消耗(含虚拟机) < 256M
    CPU消耗  < 3000ms
    
    
    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
    
    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
    注意:主类的名字必须是:Main,否则按无效代码处理。
    
    
    本题是拈游戏的一个拓展,考查减治法和动态规划法思想的运用,下面代码,对于题中所给三组数据均可以通过,但是对于平局(均为奇数或均为偶数)细节处理问题上有待证明,感觉自己处理的不够严谨。下面代码仅供参考哦~
    
    import java.util.Scanner;
    
    public class Main {
        public static int[] value = new int[1000];
        public static int[] getN = new int[3];
        public static int[] init = new int[5];
        public static char[] result = {'-','0','0','+'};
        
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            for(int i = 0;i < 3;i++)
                getN[i] = in.nextInt();
            for(int i = 0;i < 5;i++)
                init[i] = in.nextInt();
            int minN = Math.min(getN[0], Math.min(getN[1], getN[2]));
            if(minN % 2 == 1) //此处关于平局,两者是均为奇数,还是均为偶数问题,这里处理原因,是我自己猜想
                value[0] = 1;  //代表平局,两者默认均为奇数个
            else
                value[0] = 2;  //代表平局,两者默认均为偶数个
            for(int i = 1;i < minN;i++)
                value[i] = 2;  //0代表负,1和2代表平局,3代表胜
            for(int i = minN;i < 1000;i++) {
                int temp = 0;      //初始化,当前i个球,先取者必输
                
                for(int j = 0;j < 3;j++) {
                    if(i - getN[j] < 0)
                        continue;
                    if(i - getN[j] == 0 && getN[j] % 2 == 1)
                        temp = 3;
                    if(value[i - getN[j]] == 0) {  //表示i - getN[j]个球先取时,必输
                        if(getN[j] % 2 == 0)
                            temp = 3; 
                            //此时最终结果为两人取的球均为偶数个,但是若temp取三个数中另外一个数时
                            //,是必赢结果,则舍弃这个平局结果
                        else
                            temp = 2 > temp ? 2 : temp;
                    }
                    if(value[i - getN[j]] == 1) { //表示i - getN[j]个球先取时,两人取球均为奇数个
                        if(getN[j] % 2 == 0)
                            temp = 1 > temp ? 1 : temp;  //此处做比较同上
                     }
                    if(value[i - getN[j]] == 2) {//表示i - getN[j]个球先取时,两人取球均为偶数个
                        if(getN[j] % 2 == 1)
                            temp = 3;     //此种情况出现,必赢,不必做比较判断
                        else
                            temp = 2 > temp ? 2 : temp;   //此处比较同上,排除必输情况
                    }
                    if(value[i - getN[j]] == 3) {//表示i - getN[j]个球先取时,必赢
                        if(getN[j] % 2 == 1)
                            temp = 1 > temp ? 1 : temp;
                    }
                }
                
                value[i] = temp;  //当前i个球,先取者最终输赢结果
            }
            //打印题意最终结果
            for(int i = 0;i < 5;i++)
                System.out.print(result[value[init[i]]]+" ");
        }
    }
    
  • 相关阅读:
    字符串替换
    字符串查找
    字符串比较
    字节与字符串相互转换
    1365. How Many Numbers Are Smaller Than the Current Number
    1486. XOR Operation in an Array
    1431. Kids With the Greatest Number of Candies
    1470. Shuffle the Array
    1480. Running Sum of 1d Array
    【STM32H7教程】第56章 STM32H7的DMA2D应用之刷色块,位图和Alpha混合
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13077512.html
Copyright © 2011-2022 走看看