编程之美 NIM3 两堆石头的游戏 解法一Java版

理解好必胜策略很重要。

public class NewClass {

      static String nim(int x,int y){

          if(x==y){

              return “我先取,我必赢”;

          }

          if(x>y){

              int a =x;

              x=y;

              y=a;

          }

          if(x==1 && y ==2){

              return “我先取,我必输”;      //这里的必输是指对手没有故意放水。如果对方先取,无论对方怎么取,我都有赢的办法,即必胜

          }

          List list = new ArrayList();   //list中存放的是bn的值

          List list_a = new ArrayList(); //list_a中存放的是an的值

          int a=1;                    //a表示an

          list.add(2);                //b1=2,a1=1;

          list_a.add(1);

          int n =1;                   //n表示an中的下标n

          //寻找小于等于x的不安全局面,即构造不安全局面

          while(x>a){

              boolean flag = true;

              int num =++a;

              for(int i =0;i<list.size();i++){

                  if((int)list.get(i)==num){

                      flag = false;

                      break;

                  }

              }

              if(flag){

                  n++;

                  list.add(n+a);

                  list_a.add(a);

              }

          }

          System.out.println(“an=”+list_a.toString());

          System.out.println(“bn=”+list.toString());

          if(x==a){

              for(int i =0;i<list.size();i++){

                  if(y ==(int)list.get(i)){

                      return “我先取,我没有必胜策略”;

                  }

              }

              return “我先取,我有必胜策略”;

          }else{

              return “我先取,我有必胜策略”;

          }

     }

    

    public static void main(String[] args){

      String str =  nim(9,15);

      System.out.println(str);

    }

}

    原文作者:哒宝甜
    原文地址: https://blog.csdn.net/TT285955925/article/details/51488821
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞