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;
}