取球博弈.java

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 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,否则按无效代码处理。

*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值