判斷四個撲克是否能算出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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章