判断四个扑克是否能算出24点

int can24(double * data, int count, double shouldVal)
{
 
#define  fabs(x)  ((x) < 0 ? ((x)*(-1)) : (x))

/*判断4个数按照两个两个分组,分别计算出两个值,然后再根据两个值计算一下看看能不能构成shouldVal,

这个x表示其中两个构成的一对计算出的值,然后pairshould判断另外两对计算的值能否跟之前计算的x算得shouldVal,比如四个数4,4,1,2 我让4,4一对,计算出一个x=8(当然,可以计算出其他值比如4/4=1),然后我的shouldVal是24,pairShould(8)就是判断另外两个1,2能否算得一个数,这个数跟8能够算得shouldVal

*/
#define  pairShould(x) ( \
  fabs(x) > 0.00001 && can24(data + 2, 2, shouldVal/(x)) \
  || fabs(x) > 0.00001 &&can24(data + 2, 2, (x)/shouldVal)  \
  || can24(data + 2, 2, (x) - shouldVal) \
  || can24(data + 2, 2, shouldVal - (x)) \
  || can24(data + 2, 2, shouldVal + (x))  \
  || fabs(x) > 0.00001 && can24(data + 2, 2, (x) * shouldVal) \
  )

//交换两个double类型的浮点数
#define fswap(x,y) {double tmp = x; x = y; y = tmp;}
 if(count == 1) return data[0] == shouldVal;
 if(count == 2)
 {
  if(fabs(data[0]/data[1] - shouldVal) < 0.00001 || fabs(data[1]/data[0] - shouldVal) < 0.00001 ||
   fabs(data[0] - data[1] - shouldVal) < 0.00001 || fabs(data[1] - data[0] - shouldVal) < 0.00001 ||
   fabs(data[0] + data[1] - shouldVal) < 0.00001
  ) return 1;
  else return 0;
 }else if(count == 4){
  for(int i = 0; i < 4; i++)//计算两两一对能否计算出24
  {
   fswap(data[0], data[i]);

   if(pairShould(data[0] + data[1])) return 1;
   if(pairShould(data[0] * data[1])) return 1;
   if(pairShould(data[0] / data[1])) return 1;
   if(pairShould(data[1] / data[0])) return 1;
   if(pairShould(data[0] - data[1])) return 1;
   if(pairShould(data[1] - data[0])) return 1;

   fswap(data[0], data[i]);
  }
 }
 for(int i = 0; i < count; i++)//判断,先计算其中三个数的求值,然后结果跟剩余的那个数求值,就是1+3模式,看看能否计算出24
 {
  fswap(data[0], data[i]);
 
  if(can24(data + 1, count - 1, data[0]/shouldVal)) return 1;
  if(can24(data + 1, count - 1, data[0] * shouldVal)) return 1;
  if(can24(data + 1, count -1, shouldVal/data[0])) return 1;
  if(can24(data + 1, count -1, shouldVal + data[0])) return 1;
  if(can24(data + 1, count - 1, data[0] - shouldVal)) return 1;
  if(can24(data + 1, count -1, shouldVal - data[0])) return 1;

  fswap(data[0], data[i]);
 }
 return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值