判断四个扑克是否能算出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;
}

展开阅读全文

没有更多推荐了,返回首页