设为首页 加入收藏

TOP

扑克牌游戏“算24”的程序解法
2014-11-16 15:20:37 来源: 作者: 【 】 浏览:27
Tags:扑克牌 游戏 程序 解法

  一种有趣的扑克牌游戏 算24


  众多的扑克牌游戏中,算24是一种不错的锻炼反应力和计算能力的智力游戏,游戏规则大致是这样:从去掉大小王的一副扑克中任意抽取四张,读取上面的数字(其中A算1,2-10就是2-10,J算11,Q算12,K算13),然后进行加减乘除四则运算,早算出24的结果者为赢家,要求是四个数字必须且只能参与计算一次。


  举例来说:得到Q,J,2,A四张牌,对应了12,11,2,1四个数字,那么12+11+2-1可以得到24.


  算24的难题


  之所以拿24当计算目标是因为这是30以内因数最多的数,从小往大有1,2,3,4,6,8,12等七个,这使得计算出结果相对容易,整幅牌中能计算出24的组合比例较高。游戏时,如果看见其中出现一个因数,然后能把剩下的数凑成对应的一个就可以了。比如有8,9,3,2四个,看见8以后,把 9,3,2凑成3就行。因为24的因数高达整体的7/13,以上方法法也是游戏中常用的比较快速有效的得分方法。


  但对于一些较难的组合则需要四个数统合考虑,这时就比较费神了,需要用到分数法,如著名的被微软采纳进面试题之一的3,8,3,8和网络上有名的3,7,3,7,下面列出了一些常见的算24难题,如果你有兴趣可以做一做(答案在文后)


  8,3,8,3


  3,7,3,7


  12,12,12,10


  10,10,4,4


  1,4,5,6


  2,2,2,9


  3,4,7,8


  11,11,1,5


  1,2,7,7


  7,7,4,4


  1,4,5,6


  1,3,4,6


  5,5,5,1


  用程序计算24


  我们可以把计算24的算式归纳成A_B_C_D的形式,ABCD是四个操作数,_下划线代表+-*/四种操作符,再加上括号的影响,总的计算次数是有限的,如果用程序都试一遍,自然就得出能计算出24的算式。具体来说ABCD进行全排列有24种情况,+-*/进行四选三有64种情况,加上括号对算式的影响有11种具体形式,需要进行全部的计算次数是24*64*11种。


  接下来程序就比较好写了,把这些情况列出来即可,具体请见代码:


  Caculator类代码


  package com.heyang.caculate24;


  import java.util.LinkedHashSet;


  import java.util.Set;


  /**


  * 算24的计算器,传入包含四个数的数组,输出可能的计算组合


  * 说明:


  * 作者:何杨(heyang78@gmail.com)


  * 创建时间:2010-6-22 下午12:56:21


  * 修改时间:2010-6-22 下午12:56:21


  */


  public class Caculator{


  // 传入的四个数的数组


  private Integer[] arr;


  // 存储四个数所有排列方式的集合


  private Set set;


  // 加减乘除四种操作符


  private static final char Plus=’+';


  private static final char Minus=’-';


  private static final char Multi=’*';


  private static final char Divide=’/';


  // 包含加减乘除四种操作符的数组


  private static final Character[] ArithOperators={Plus,Minus,Multi,Divide};


  // 存储四种算术操作符选出三种进行组合的集合,总计有64个元素


  private static Set operatorSet;


  /**


  * 静态构造子


  * 用于初始化四种算术操作符的集合


  * 不管此类形成多少实例,operatorSet总是一样的


  */


  static{


  operatorSet=new LinkedHashSet ();


  // 四选三,允许重复,用循环即可


  int i,j,k;


  for(i=0;i<4;i++){


  for(j=0;j<4;j++){


  for(k=0;k<4;k++){


  operatorSet.add(new Character[]{ArithOperators[i],ArithOperators[j],ArithOperators[k]});


  }


  }


  }


  }


  /**


  * 传入一个四位数组,将所有的排列方式放入链表


  * @param arr


  */


  public Caculator(Integer[] arr){


  // 保存


  this.arr=arr;


  // 得到四个数字可能的排列


  set=new LinkedHashSet ();


  permutation(arr,0,arr.length);


  // 打印出可能的算式


  printPossibleCacu();


  }


  /**


  * 进行全排列,将所有的排列放入链表


  *


  * 说明:


  * @param arr


  * @param start


  * @param end


  * 创建时间:2010-6-22 下午01:04:44


  * 修改时间:2010-6-22 下午01:04:44


  */


  private void permutation(Integer[] arr,int start,int end){


  if(start


  permutation(arr,start+1,end);


  for(int i=start+1;i


  Integer temp;


  temp=arr[start];


  arr[start]=arr[i];


  arr[i]=temp;


  permutation(arr,start+1,end);


  temp=arr[i];


  arr[i]=arr[start];


  arr[start]=temp;


  }


  }


  else{


  set.add(new Integer[]{arr[0],arr[1],arr[2],arr[3]});


  }


  }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java操作ini配置文件类 下一篇Java数组之初始化及实例代码

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: