取球博弈.java

来源:互联网 发布:雪橇三傻 知乎 编辑:程序博客网 时间:2024/05/20 20:47
package A类有价值的回顾的;import java.util.Scanner;public class 取球博弈 {    private static int[] a = new int[3];    private static int[] bb = new int[5];    private static int f(int b,int myc,int hisc){        //多分支是来源于 用a中的哪个来选择b中的哪个        boolean is0 = false;        if(b-a[0] < 0 && b-a[1] < 0 && b-a[2] < 0){//没有能够取到的意思是说,都小于0了        if(myc%2 == 1&& hisc%2 == 0) return  1;        if(myc%2 == 1&& hisc%2 == 1) return  0;        if(myc%2 == 0&& hisc%2 == 1) return -1;        if(myc%2 == 0&& hisc%2 == 0) return  0;        }        for(int i=0;i<a.length;i++){            if(b-a[i]>=0){//如果没有这里的限制,将会导致本身不能进行的选择进行了              int n = f(b-a[i],hisc,myc + a[i]);//如果不用n,而是用两次f(b-a[i],hisc,myc),重复            if(n == -1) return  1;            if(n == 0)  is0 = true;//如果对面选择了一个最优化的平局,对你来说你当然并不会满足,就会再往后寻找看一下是否能赢            }        }        if(is0 == true){            is0 = false;            return 0;        }        //for循环完了,既没有能赢的,也没有能逼平的,只好输了        return -1;    }    public static void main(String[] args){        boolean is1 = false,is0 = false;//初始化为什么要初始化为TRUE,很奇怪啊你,就像那个没关水龙头的装修工,你TM这不是砸自己的招牌,sbbbbb        Scanner sc = new Scanner(System.in);//老子就是要写代码,我能我的快感,那种探索的过程,虽然有粗心这个拦路虎,但是我也不畏惧,每个人都有自己非常有优势的地方,而真正的成功者是能够弥补自己短处的人,因为这个世界上的一件事你的优势只占一部分        for(int i=0;i<a.length;i++){            a[i] = sc.nextInt();        }        for(int j=0;j<bb.length;j++){            bb[j] = sc.nextInt();        }        for(int k=0;k<bb.length;k++){        int b=bb[k],myc=0,hisc=0;        for(int i=0;i<a.length;i++){            if(b-a[i] >= 0){            int n = f(b-a[i],hisc,myc + a[i]);            if(n == -1) { is1=true; break;   }            if(n == 0)  { is0=true; continue;}               //对面return了-1,你就是胜利的            }        }        //自己的多次选择分别交给对手处理,根据对手的return,只要能赢就退出,如果平了再看看接下来的有没有能赢的,实在没有只好输了        //你选择了一个最优的,我当然也要选择一个最优的,没什么问题        if(is1 == true){//这里的优先级一定要搞清楚            is1 =false;            is0 =false;            System.out.print("+ ");        }        else if(is0 == true){            is0 =false;            System.out.print("0 ");        }else        System.out.print("- ");    }    }}/* * 取球博弈两个人玩取球的游戏。一共有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 31 2 3 4 5程序应该输出:+ 0 + 0 -再例如,输入:1 4 510 11 12 13 15程序应该输出:0 - 0 + +再例如,输入:2 3 57 8 9 10 11程序应该输出:+ 0 0 0 0资源约定:峰值内存消耗(含虚拟机) < 256MCPU消耗  < 3000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。注意:主类的名字必须是:Main,否则按无效代码处理。*/
原创粉丝点击